web-dev-qa-db-ja.com

Python複数回一致する正規表現

パターンの複数のインスタンスを持つ可能性のある文字列に対してパターンを照合しようとしています。すべてのインスタンスが個別に必要です。 re.findall()すべきであるそれを行うが、私は何が間違っているのかわかりません。

_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')
_

http://url.com/12 」、 http://url.com/456 の2つの数値123と456がmatchリスト。

パターンとして'/review: ((http://url.com/(\d+)\s?)+)/'も試しましたが、うまくいきませんでした。

16
mavili

これを使って。目的の結果を達成するには、キャプチャグループの外に「レビュー」を配置する必要があります。

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')]
15
Narendra Yadala

正規表現に余分な/があります。 pythonでは、パターンは単なる文字列である必要があります。たとえば、これの代わりに:

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

そのはず:

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

また、通常pythonでは、実際には次のような「生の」文字列を使用します。

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

文字列の前にある追加のrにより、バックスラッシュのエスケープなどを何度も行う必要がなくなります。

6
John Montgomery

2段階のアプローチを使用します。最初に「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)
1
til_b