207

の代わりにpython が一致する"(.*)"場合、そのような python 正規表現を作成するにはどうすればよいですか?"a (b) c (d) e""b""b) c (d"

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

4

7 に答える 7

303

あなたは全能者を求めます*?

ドキュメントから、貪欲対非貪欲

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

于 2009-04-19T23:27:21.917 に答える
77
>>> 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>ます。

于 2009-04-19T23:31:33.343 に答える
16

うまくいきません\\(.*?\\)か?それが貪欲でない構文です。

于 2009-04-19T23:28:04.240 に答える
7

貪欲でない一致を使用することは良い出発点ですが、の使用を再考することをお勧めします.*-これはどうですか?

groups = re.search(r"\([^)]*\)", x)
于 2009-04-21T18:01:15.117 に答える
6

「(b)」に合わせますか?ジトラックスとパオロが提案したようにしてください。「b」に合わせますか?行う

>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'
于 2009-04-19T23:54:55.907 に答える
6

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

于 2009-04-21T18:06:23.437 に答える