有个一起学习Python的小伙伴(我俩都很菜),他给我发过来如下代码:
import re
haRegex=re.compile(r'(ha){2,5}')
mo=haRegex.findall('hahaha,hahahahhahahha,jdfoqaijeihahahahaha,haha')
print(mo)
这段代码output出来是
['ha', 'ha', 'ha', 'ha', 'ha']
他问我为什么正则表达式的findall不能匹配出整个的字符串,不是‘hahaha’这样的输出。
因为我也不知道所以去搜索了一下,发现了捕获分组这个概念。
正则表达式里面有括号的时候,括号表示为一个分组,其内容直接作为结果输出,而不把整个正则表达式匹配到的内容作为结果输出。
为了获得我们想匹配的整个字符串,就要用到非捕获组的概念了。以 (?) 开头的组是纯的非捕获 组,它不捕获文本 ,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本。
比如在我们这个例子中,可以写作:
import re
haRegex=re.compile(r'(?:ha){2,5}')
mo=haRegex.findall('hahaha,hahahahhahahha,jdfoqaijeihahahahaha,haha')
print(mo)
这样输出的结果是:
['hahaha', 'hahaha', 'haha', 'hahahahaha', 'haha']