2017-01-19 16 views
-3

代わりのP 『全体「それだけを印刷して、最終的な」文』を印刷する誰もがここに助けることはでき正規表現の印刷のみ最初の文字

final = r'print "\n^^^###***===TP test result: $final_verdict===***###^^^\n";' 
searchObj = re.compile(r'[\w\s\"\n\^\^\^\#\#\#\*\*\*\=\=\=\w+\s\w+\:\s\$\w+\=\=\=\#\#\#\*\*\*\^\^\^\n\"\;]') 
print(searchObj) 
y=searchObj.match(final) 
if y: 
    print("Found",y.group()) 
else: 
    print("Nothing") 

結果:?

re.compile('[\\w\\s\\"\\n\\^\\^\\^\\#\\#\\#\\*\\*\\*\\=\\=\\=\\w+\\s\\w+\\:\\s\\$\\w+\\=\\=\\=\\#\\#\\#\\*\\*\\*\\^\\^\\^\\n\\"\\;]') 

見つかりP

+1

あなたの範囲は1文字にしか一致しません。閉じ括弧の後に '+'を追加することを考えてみましょう。バックスラッシュを倍にすることを避けるために生の接頭辞も考慮してください... –

+0

@ Jean-FrançoisFabre:彼の意図は文字群を全く定義しないことでした。 –

答えて

2

正規表現に角括弧を入れました。これは文字グループを定義したことを意味します。

r'\w\s\"\n\^\^\^\#\#\#\*\*\*\=\=\=\w+\s\w+\:\s\$\w+\=\=\=\#\#\#\*\*\*\^\^\^\n\"\;' 

文字グループを使用すると、角かっこの間のいずれかの文字が表示されます。したがって、[ab]は、aまたはbであり、aではなく、bであることを意味します。

しかし、あなたの文字列はもはや一致しません(シーケンスとのマッチは1文字ではなく難しくなります)。ただし、次のように改善することができます。

r'\w\s\"\\n\^\^\^###\*\*\*===\w+\s\w+\s\w+:\s\$\w+===\*\*\*###\^\^\^\\n\";' 
#  ^  ^^^  ^^^  ^^^^^  ^^^  ^^^ ^

2行目のカレットに変更が反映されます。まず、#=をエスケープする必要はありません。さらに、Pythonが新しい行の文字として認識する\nを指定しますが、\n(2文字)と一致させたいので、バックスラッシュをエスケープする必要があります。\\n;結局コロンの前に3つの言葉があることを忘れた(:)。

正規表現をテストして修正するには、regex101を使用します。

+1

あなたは '#'と ':'と '='の文字をエスケープする必要はありません。それはより明確な表現をする... –

+0

@ Jean-FrançoisFabre:OPは '\'もエスケープするのを忘れてしまったので、正規表現が一致しないので、私は改良版で作業しています。 –

+0

regex101はこの問題を解決するのを助けました。回答いただきありがとうございます。 –

関連する問題