Pythonの貪欲でない正規表現


150

代わりにpythonが一致するとしたら"(.*)"、どのようにpython正規表現を作成するのですか?"a (b) c (d) e""b""b) c (d"

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

回答:


209

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

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

非貪欲修飾子*?+???、または{m,n}?[...]として試合少し できるだけテキスト。


インターネットアーカイブによると、リンク先はPythonの「re」モジュールドキュメントのコピーだけだったため、Treyのリンクも同様に機能します。
spiffytech 2012

2
これの一般的な英語名は何*?ですか?
Trevor Boyd Smith

ワイルドカード文字@Trevor Boyd Smith
セルジュ

3
これは「貪欲でない」修飾子と呼ばれます
Brunetton

65
>>> 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>」のみが一致します。



5

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


5

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

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

3

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

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

0

まず、正規表現で「*」を使用することはお勧めしません。はい、わかっています。これは、最も使用されている複数文字の区切り文字ですが、それでも悪い考えです。これは、その文字の任意の繰り返しに一致しますが、 "any"には0が含まれるためです。これは通常、構文エラーをスローしたいもので、受け入れられません。代わりに、+長さ> 1の繰り返しに一致する符号を使用することをお勧めします。さらに、私が見ることができることから、固定長の括弧で囲まれた式を扱っています。その結果、おそらく{x, y}構文を使用して、必要な長さを具体的に指定できます。

ただし、本当に貪欲でない繰り返しが必要な場合は、全力のコンサルタントに相談することをお勧めし?ます。これを正規表現の繰り返し指定子の最後に配置すると、正規表現のその部分でテキストをできるだけ少なく見つけることが強制されます。

そうは言っても、?Dr。Whoのソニックドライバーのように、慎重に調整されていない場合は「わずかに」望ましくないことを行う傾向があるため、私はそれを慎重に検討します。たとえば、入力例を使用する場合((1)、一致として識別されます(2番目のrparenがないことに注意してください)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.