「a(b)c(d)e」pythonが「b」ではなく「b」に一致するように、「(。*)」のようなpython正規表現を作成するにはどうすればよいですか)c(d "?
「。」の代わりに「[^)]」を使用できることは知っていますが、正規表現を少し簡潔に保つより一般的なソリューションを探しています。 python「ちょっと、これをできるだけ早く一致させる」という方法はありますか?
あなたはすべての強力な「*?」を求めます
http://docs.python.org/3/howto/regex.html#greedy-versus-non-greedy
貪欲でない修飾子*?、+?、??、または{m、n}? [...]できるだけ小さなテキストとしてと一致します。
>>> 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>
」のみが一致します。
\\(.*?\\)
は機能しませんか?それは貪欲でない構文です。
他の人が?を使用して言ったように*量指定子の修飾子は、当面の問題を解決しますが、注意してください。正規表現が機能しなくなる領域に迷い込み始め、代わりにパーサーが必要になります。たとえば、文字列「(foo(bar))baz」は問題を引き起こします。
貪欲でないマッチを使用することは良いスタートですが、.*
の使用を再検討することもお勧めします-これはどうですか?
groups = re.search(r"\([^)]*\)", x)
「(b)」に一致させますか? ZitraxとPaoloが示唆したように。 「b」と一致させますか?行う
>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'