以下是我的代码。我的理解是我的模式说你必须遇到汽车和宠物是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', '']
使用
pattern = r'car(?:pet)?'
代替。 ?:
使得该组不被捕获(参见regex syntax docs),这对findall
有所不同,因为它返回了一个捕获组列表,如果你的模式中存在这样的:
>>> re.findall(pattern, "carpet and car")
['carpet', 'car']
原因在re
documentation of findall()
中提到:
返回字符串中pattern的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配。
如果您想要预期的结果,请使用finditer()
。