2017-08-11 14 views
2

以下の文字列を指定します。貪欲でない一致が必要な場合の正規表現の一致

私は引用符とブラケットを参照することにより、"And now for something completely different!"(Monty Python)をマッチさせたいです。この例では、引用符の後ろに括弧がないため、"Hello"は一致しません。近くにある、".*?"試合"Hello"と別に"And now for something completely different!"が、私はこれまで、ブラケット、".*?"(.*)を追加した場合、私は、文字列全体にマッチ終わる:

非欲張りアプローチが行くための一つの方法のように見えます。

"Hello", he said. "And now for something completely different!"(Monty Python) 

ある

が返されます。

正規表現を強制的に動作させるにはどうすればよいですか?私はPythonで作業しているので、Lookahead/Behindを使用するオプションがあります。

+0

リテラル括弧に一致するようにするには、バックスラッシュでエスケープするか、またはクラスelseに配置すると、キャプチャグループが開きます。さらに、私はむしろネガティブなクラスを使用します。非貪欲なドットの代わりに、最短のマッチを終わらせることはありません。 –

答えて

2

これは動作します:

"[^"]*"(:?\(.*\)) 

それは引用符の単一のセットを探します(間には引用符、すなわちませんが) とそれに続くブラケットのセット

1

あなたがこの試すことができます:

s = '"Hello", he said. "And now for something completely different!"(Monty Python).' 

import re 

new_data = re.findall('"(.*?)"', s) 

final_data = [i for i in new_data if len(re.findall("\w+(?=!)", i)) > 0][0] 

出力:

'And now for something completely different!' 
関連する問題