繁体   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