python正则表达式搜索和findall

问题描述 投票:0回答:2

以下是我的代码。我的理解是我的模式说你必须遇到汽车和宠物是oprtion。即检查单词车和地毯两者。现在重新搜索匹配地毯是好的。但重新输出应该是['地毯','汽车'],但它显示我['宠物','']请让我知道我不对的地方?

import re
string = "carpet and car"
pattern = r'car(pet)?'
print(re.search(pattern, string))
print(re.findall(pattern, string))

这是代码的输出:

<_sre.SRE_Match object; span=(0, 6), match='carpet'>
['pet', '']
python regex python-3.x
2个回答
1
投票

使用

pattern = r'car(?:pet)?'

代替。 ?:使得该组不被捕获(参见regex syntax docs),这对findall有所不同,因为它返回了一个捕获组列表,如果你的模式中存在这样的:

>>> re.findall(pattern, "carpet and car")
['carpet', 'car']

1
投票

原因在re documentation of findall()中提到:

返回字符串中pattern的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配。

如果您想要预期的结果,请使用finditer()

© www.soinside.com 2019 - 2024. All rights reserved.