![](/img/trans.png)
[英]Differences in re.findall and re.finditer — bug in Python 2.7 re module?
[英]Apart from returning string and iterator in re.findall() and re.finditer() in python do their working also differ?
編寫了以下代碼,以便我獲得與 str_key 匹配的所有可變長度模式。
line = "ABCDABCDABCDXXXABCDXXABCDABCDABCD"
str_key = "ABCD"
regex = rf"({str_key})+"
find_all_found = re.findall(regex,line)
print(find_all_found)
find_iter_found = re.finditer(regex, line)
for i in find_iter_found:
print(i.group())
Output 我得到了:
['ABCD', 'ABCD', 'ABCD']
ABCDABCDABCD
ABCD
ABCDABCDABCD
預期的 output 是 finditer() 打印的最后三行。 我期待這兩個函數都能給我相同的輸出(列表或可調用無關緊要)。 為什么它在 findall() 中有所不同,據我所知,這兩個函數的不同之處僅在於它們的返回類型,而不在於匹配的模式。 他們的工作方式是否不同,如果不是我做錯了什么?
您想訪問groups
而不是group
。
>>> find_iter_found = re.finditer(regex, line)
>>> for i in find_iter_found:
... print(i.groups()[0])
這里解釋了這兩種方法之間的區別。
就匹配過程而言,這兩個函數的行為幾乎相同,如下所示:
re.findall(模式,字符串,標志=0)
返回字符串中模式的所有非重疊匹配,作為字符串列表。 從左到右掃描字符串,並按找到的順序返回匹配項。 如果模式中存在一個或多個組,則返回組列表; 如果模式有多個組,這將是一個元組列表。 結果中包含空匹配項。
在 3.7 版更改: 非空匹配現在可以在之前的空匹配之后開始。
re.finditer(模式,字符串,標志=0)
返回一個迭代器,該迭代器在字符串中 RE 模式的所有非重疊匹配中產生匹配對象。 從左到右掃描字符串,並按找到的順序返回匹配項。 結果中包含空匹配項。
在 3.7 版更改: 非空匹配現在可以在之前的空匹配之后開始。
對於re.findall
更改您的正則表達式
regex = rf"({str_key})+"
進入
regex = rf"((?:{str_key})+)"
。 量詞+
必須在捕獲組內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.