下面是我的代码。我的理解是我的模式说你必须满足汽车和宠物的要求。例如,检查单词car和地毯是否都正确。现在重新搜索匹配地毯就可以了。但是re.finall的输出应该是['carpet','car'],但它显示的是['pet','']请让我知道我不正确的地方吗?
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', '']
答案 0 :(得分:1)
re
documentation of findall()
中提到了原因:
以字符串的形式返回字符串中所有不重复的模式匹配项 字符串。从左到右扫描字符串,并返回匹配项 按照找到的顺序。 如果模式中存在一个或多个组, 返回群组列表;这将是一个元组列表,如果模式 有一个以上的团体。 空匹配项包含在结果中。
如果您想要期望的结果,请使用finditer()
。
答案 1 :(得分:1)
使用
pattern = r'car(?:pet)?'
相反。 ?:
使捕获组变为非捕获组(请参见regex syntax docs),这与findall
有所不同,因为它返回捕获组的列表(如果您的模式中存在捕获组的列表):< / p>
>>> re.findall(pattern, "carpet and car")
['carpet', 'car']