search(r'(ab)+', "ababababab") 在Python中能匹配所有字符吗

0 投票
2 回答
533 浏览
提问于 2025-04-16 03:16

我发现用 findall(r'(ab)+', "ababababab") 只能匹配到 ["ab"]

>>> re.findall(r'(ab)+', "ababababab")
['ab']

我知道用 r'(?:ab)+' 可以匹配到所有的字符

>>> re.findall(r'(?:ab)+', "ababababab")
['ababababab']

这是为什么呢?


抱歉,我可能没有把问题说清楚

(?:ab) 把 'ab' 当成一个整体,假设我们把 c 设为 ab,那么 c+=ababab....

所以这很明显

>>> re.findall(r'(?:ab)+', "ababababab") <br>
['ababababab'] 

我的问题是,为什么会这样:

>>> match=re.search(r'(ab)+', "ababababab") <br>
>>> match.group()<br>
'ababababab'

2 个回答

1

如果这个模式里有一个组,findall函数会返回这个组的内容,而不是整个匹配的结果。在这里,(ab)+可以匹配整个字符串,但它只返回组的内容(ab)。

6

我觉得你在问的问题是,为什么会返回这个:

>>> re.findall(r'(ab)+', "ababababab")
['ab']

答案是,如果你的模式里有一个或多个分组,那么findall会返回一个包含所有匹配分组的列表。不过你的正则表达式里有一个分组在正则表达式中被多次匹配,所以它只取最后一个匹配的值。

我想你想要的是这个:

>>> re.findall(r'(ab)', "ababababab")
['ab', 'ab', 'ab', 'ab', 'ab']

或者你发的那个版本:

>>> re.findall(r'(?:ab)+', "ababababab")
['ababababab']

撰写回答