Python中re.findall()函数是要求正则表达式在捕获第0组数据时,要在正则表达式上加小括号才能捕获.
也就是说如果你要获取整个正则表达式匹配的数据(你这里是电子邮箱地址),需要在正则表达式外面加小括号,
然后取第0捕获组的数据(你这里是[x[0] for x in zhengze]),
因为findall函数把每一个匹配的多个捕获组(就是你正则表达式中的小括号中)的数据放到一个元组里,所以要用for循环把第0捕获组的数据取出来.
具体程序改进如下
>>>zhengze=re.findall("([A-Za-z0-9]+@(163|qq|gmail)\.com)",txt)
>>>[x[0] for x in zhengze]
结果就是你要的邮箱列表了.
你要的代码:
import re
emailStr = "abc123@163.com xxx 456def@qq.com yyy 789ghi@gmail.com"
allEmailList = re.findall("([a-zA-Z0-9]+@(?:163|qq|gmail)\.com)", emailStr) # ['abc123@163.com', '456def@qq.com', '789ghi@gmail.com']
print(allEmailList)
中间过程的代码:
# allEmailList = re.findall("[a-zA-Z0-9]@(163|qq|gmail)\.com", emailStr) # ['163', 'qq', 'gmail']
# allEmailList = re.findall("([a-zA-Z0-9]+@(163|qq|gmail)\.com)", emailStr) # [('abc123@163.com', '163'), ('456def@qq.com', 'qq'), ('789ghi@gmail.com', 'gmail')]
# allEmailList = re.finditer("([a-zA-Z0-9]+@(163|qq|gmail)\.com)", emailStr) #
附录:
(?:163|qq) 可以这样写,则只匹配而不产生分组