2017-11-02 7 views
0

これはウェブサイト上のコンテンツのサイズに関するものです。このlink checker toolはPython Regexをサポートしています。リンクチェッカーでは、1つのコンテンツディメンションに関する情報を取得したいと考えています。特殊文字のPythonを使用したRegex否定ルックアヘッド文字列

de_deという文字列(​​オプション)以外はすべて一致させたいと思います。

https://www.example.com/int_en 
https://www.example.com/int_de 
https://www.example.com/de_de ##should not match or all others should match 
https://www.example.com/be_de 
https://www.example.com/fr_fr 
https://www.example.com/gb_en 
https://www.example.com/us_en 
https://www.example.com/ch_de 
https://www.example.com/ch_it 
https://www.example.com/shop 

私は、これらのアプローチわたってるしきどこかに立ち往生しています:

https:\/\/www.example.com\/\bde\_de 
https:\/\/www.example.com\/[^de]{2,3}[^de] 
https:\/\/www.example.com\/[a-z]{2,3}\_[^d][^e] 
https:\/\/www.example.com\/([a-z]{2,3}\_)(?!^de$) 
https:\/\/www.example.com\/[a-z]{2,3}\_ 
https:\/\/www.example.com\/(?!^de\_de$) 

にはどうすれば特殊文字(アンダースコア)で文字列を一致させるために、負の先読みを使用できますか?

(?!^de_de$) 

私はregexの新機能です、どんな助けや入力がよろしいですか?

+0

すべての '/ de_は*' '/ de_de'だけ一致するかではないでしょうか? – Arman

+0

'https:\/\/www.example.com \ /(?! de_de(?:\/| $))[a-z - ] +' –

+0

@Arman de_deは一致しません。/int-de、/ de_en、/ ch_de、/ shop、... --no-follow-urlオプションに一致させたい。 –

答えて

0

あなたは試みることができる:

https:\/\/www.example.com\/.+?(?<!de_de)\b 

これは一致します

https://www.example.com/shop 

ではなく:

https://www.example.com/de_de 

Pythexリンクhere

説明:ここではnegatを使用単語境界(\b)に適用された(?<!de_de)の背後にある一見。これは、単語境界が "de_de"に先行していないことを発見しなければならないことを意味する。

1

は、次の正規表現を使用します。

https://www\.example\.com/(?!de_de(?:/|$))[a-z_]+ 

regex demoを参照してください。 httpと一致させる場合は、のhttpの後にs?を追加します。

文字列の実際のリテラルドットと一致するように、ドットをエスケープする必要があります。 (?!de_de(?:/|$))[a-z_]+の部分は、de_deではない/または文字列の末尾の1 +文字/アンダースコア([a-z_]+を参照)と一致します。

Python demo

import re 
ex = ["https://www.example.com/int_en","https://www.example.com/int_de","https://www.example.com/de_de","https://www.example.com/be_de","https://www.example.com/de_en","https://www.example.com/fr_en","https://www.example.com/fr_fr","https://www.example.com/gb_en","https://www.example.com/us_en","https://www.example.com/ch_de","https://www.example.com/ch_it"] 
rx = r"https://www\.example\.com/(?!de_de(?:/|$))[a-z_]+" 
for s in ex: 
    m = re.search(rx, s) 
    if m: 
     print("{} => MATCHED".format(s)) 
    else: 
     print("{} => NOT MATCHED".format(s)) 

出力:

https://www.example.com/int_en => MATCHED 
https://www.example.com/int_de => MATCHED 
https://www.example.com/de_de => NOT MATCHED 
https://www.example.com/be_de => MATCHED 
https://www.example.com/de_en => MATCHED 
https://www.example.com/fr_en => MATCHED 
https://www.example.com/fr_fr => MATCHED 
https://www.example.com/gb_en => MATCHED 
https://www.example.com/us_en => MATCHED 
https://www.example.com/ch_de => MATCHED 
https://www.example.com/ch_it => MATCHED 
+0

私は@ gil.fernandesの解決策に行き、? https部分に私はPyExコードを必要としませんでした、ちょうどRegEx :)説明のためにまだありがとう。 –

+0

@SeviS [* that * regexがあなたが期待していないものとマッチするかもしれないことに気をつけてください](https://regex101.com/r/mBcm5c/2)。また、Pythonの正規表現で '/'をエスケープするポイントはありません。 –

+0

私はテストのためにこのサイトhttps://regexr.com/を使用しました。このサイトでは、ブラウザの組み込み正規表現構文を使用しているため、エスケープが必要でした。完全停止 '.'は"任意の単一の文字 "なので期待された動作ですか?私は将来完全に停止するためにエスケープを使用します、これは私が推測する正しい方法ですか? https://regex101.com/r/mBcm5c/3もう一度ありがとうございます。 –

関連する問題