簡體   English   中英

除了在 python 中的 re.findall() 和 re.finditer() 中返回字符串和迭代器之外,它們的工作方式是否也不同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM