search(r'(ab)+', "ababababab") 在Python中能匹配所有字符吗
我发现用 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']