2013-07-01 4 views
9

パターンの複数のインスタンスを持つ可能性のある文字列とパターンを一致させようとしています。私はすべてのインスタンスを別々に必要とします。 re.findall()になりますが、私が間違っていることは分かりません。複数回一致するPython正規表現

pattern = re.compile('/review: (http://url.com/(\d+)\s?)+/', re.IGNORECASE) 
match = pattern.findall('this is the message. review: http://url.com/123 http://url.com/456') 

私はmatchリストの異なる要素であることを 'http://url.com/123'、http://url.com/456と二つの数123 & 456を必要としています。

私はまた、'/review: ((http://url.com/(\d+)\s?)+)/'をパターンとして試しましたが、運はありません。

+0

を与える:第二HTTPなどの部分は、その前にそれを持っていません。 – abc123

+0

はい、私はそこに必要です、それは正規表現の一部です。私はそこに何かURLは必要ありません。文字列 'review:'の後にあるものだけです。 – mavili

答えて

12

これを使用してください。目的の結果を得るには、キャプチャグループの外に「レビュー」を配置する必要があります。

pattern = re.compile(r'(?:review:)?(http://url.com/(\d+))\s?', re.IGNORECASE) 

これは単にレビューを削除し、出力

>>> match = pattern.findall('this is the message. review: http://url.com/123 http://url.com/456') 
>>> match 
[('http://url.com/123', '123'), ('http://url.com/456', '456')] 
+0

、仕事をしてくれてありがとう! '?(review:review) 'の後の'? 'も、それがなければ私にすべての試合を与えてくれなかったので、非常に重要です。 ;) – mavili

+0

'をインポートすることを忘れないでください' – Rambatino

5

あなたは余分な/正規表現を持っています。 Pythonではパターンは文字列でなければなりません。例えばこれに代えて:

pattern = re.compile('/review: (http://url.com/(\d+)\s?)+/', re.IGNORECASE) 

それは次のようになります。上の

pattern = re.compile(r'review: (http://url.com/(\d+)\s?)+', re.IGNORECASE) 

余分R:

pattern = re.compile('review: (http://url.com/(\d+)\s?)+', re.IGNORECASE) 

はまた、通常のpythonであなたが実際にこのような "生" の文字列を使用したいです文字列の先頭は、バックスラッシュをエスケープするなど、たくさんのことをする必要がありません。

0

2段階アプローチを使用してください。まずeverythin g: "review:"からEOLに移動し、トークン化します。

msg = 'this is the message. review: http://url.com/123 http://url.com/456' 

review_pattern = re.compile('.*review: (.*)$') 
urls = review_pattern.findall(msg)[0] 

url_pattern = re.compile("(http://url.com/(\d+))") 
url_pattern.findall(urls) 
関連する問題