webdevqa.jp.net

Python貪欲でない正規表現

「a(b)c(d)e」pythonが「b」ではなく「b」に一致するように、「(。*)」のようなpython正規表現を作成するにはどうすればよいですか)c(d "?

「。」の代わりに「[^)]」を使用できることは知っていますが、正規表現を少し簡潔に保つより一般的なソリューションを探しています。 python「ちょっと、これをできるだけ早く一致させる」という方法はありますか?

120
So8res

あなたはすべての強力な「*?」を求めます

http://docs.python.org/3/howto/regex.html#greedy-versus-non-greedy

貪欲でない修飾子*?、+?、??、または{m、n}? [...]できるだけ小さなテキストとしてと一致します

152
Trey Stout
>>> x = "a (b) c (d) e"
>>> re.search(r"\(.*\)", x).group()
'(b) c (d)'
>>> re.search(r"\(.*?\)", x).group()
'(b)'

ドキュメントによると

'*'、 '+'、および '?'修飾子はすべて貪欲です。できるだけ多くのテキストに一致します。この動作が望ましくない場合があります。 RE <.*>が '<H1>title</H1>'と一致する場合、 '<H1>'だけでなく、文字列全体と一致します。修飾子の後に '?'を追加すると、貪欲でない、または最小限の方法で一致が実行されます。可能な限り少ない文字が一致します。前の式で.*?を使用すると、「<H1>」のみが一致します。

60

\\(.*?\\)は機能しませんか?それは貪欲でない構文です。

13
Zitrax

他の人が?を使用して言ったように*量指定子の修飾子は、当面の問題を解決しますが、注意してください。正規表現が機能しなくなる領域に迷い込み始め、代わりにパーサーが必要になります。たとえば、文字列「(foo(bar))baz」は問題を引き起こします。

5
Chas. Owens

貪欲でないマッチを使用することは良いスタートですが、.*の使用を再検討することもお勧めします-これはどうですか?

groups = re.search(r"\([^)]*\)", x)
4
ojrac

「(b)」に一致させますか? ZitraxとPaoloが示唆したように。 「b」と一致させますか?行う

>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'
3
David Berger