パターンの複数のインスタンスを持つ可能性のある文字列に対してパターンを照合しようとしています。すべてのインスタンスが個別に必要です。 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?)+)/'
も試しましたが、うまくいきませんでした。
これを使って。目的の結果を達成するには、キャプチャグループの外に「レビュー」を配置する必要があります。
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')]
正規表現に余分な/があります。 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により、バックスラッシュのエスケープなどを何度も行う必要がなくなります。
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)