2013-07-01 213 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') 

我需要 'http://url.com/123',並且http://url.com/456兩個數123 & 456是match列表的不同的元件。

我也試過'/review: ((http://url.com/(\d+)\s?)+)/'作爲模式,但沒有運氣。

+0

只是刪除回顧:部分作爲第二HTTP不會有之前的數值。 – abc123

+0

是的,但我需要那裏,它是正則表達式的一部分。我不需要任何網址,只是字符串'審查:' – 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)'之後的'?'也很重要,因爲它沒有給我所有的匹配。 ;) – mavili

+0

不要忘記'導入re' – Rambatino

5

你在正則表達式中有額外的/。在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 ON字符串的前面可以避免你必須做大量的反斜槓轉義等。

0

使用兩步法:首先得到每一個從「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)