2010-05-10 112 views
18

我想匹配字符串中最後一個簡單模式的出現次數,例如:查找python正則表達式的最後一個匹配項

list = re.findall(r"\w+ AAAA \w+", "foo bar AAAA foo2 AAAA bar2") 
print "last match: ", list[len(list)-1] 

然而,如果字符串是很長,產生了巨大的匹配列表。有沒有更直接的方法來匹配第二次出現「AAAA」或我應該使用這種解決方法?

+6

另一種選擇可能是顛倒字符串('mystr [:: - 1]')並搜索模式反轉的第一次出現。 – ChristopheD 2010-05-10 11:39:50

+2

@ChristopheD,毛!只有比正則表達式更難理解的東西是一個倒退的東西。 – mlissner 2014-07-02 17:45:30

回答

24

你可以使用$是表示行結束符:

>>> s = """foo bar AAAA 
foo2 AAAA bar2""" 
>>> re.findall(r"\w+ AAAA \w+$", s) 
['foo2 AAAA bar2'] 

此外,請注意list是你變一個不好的名字,因爲它陰影內置式。要訪問列表的最後一個元素,你可以只使用[-1]指數:

for match in re.finditer(r"\w+ AAAA \w+", "foo bar AAAA foo2 AAAA bar2"): 
    pass 

後:

>>> lst = [2, 3, 4] 
>>> lst[-1] 
4 
+0

如果我遇到多行字符串,該怎麼辦? – SDD 2010-05-10 11:26:30

+1

@SDD:它仍然可以正常工作 – SilentGhost 2010-05-10 11:28:11

+3

這不適用於像這樣的輸入字符串:「foo bar AAAA foo2 AAAA bar2 bar3」。當然,我們不知道這樣的情況是否可能,我們沒有足夠的信息。 – tzot 2010-06-21 15:31:19

22

你能夠通過遍歷所有的匹配並保持最後一場比賽避免列表建設這,match舉行最後一場比賽,並適用於模式所有組合的搜索字符串。您可能首先要將match設置爲None,因爲如果沒有匹配,則match將不會設置爲任何值。

+0

這在很多使用案例中都非常有用。您通常會想要替換所有出現的模式,然後自定義處理輸入字符串的最後部分。 – 2013-07-17 12:17:26

相關問題