问题描述
以下是我的python代码:
import re
msg = '''txt@deepstone.com.tw kkk@gmail.com'''
pattern = r'''(
[a-zA-Z0-9_.]+
@
[a-zA-Z0-9-.]+
\.
[a-zA-Z]{2,4}
(\.)?
([a-zA-Z]{2,4})?
)'''
email = re.findall(pattern,msg,re.VERBOSE)
print(email)
我在 python shell 中运行它,得到以下结果:
[('txt@deepstone.com.tw','',''),('kkk@gmail.com','')]
我的问题是为什么第一个元组中的第二个和第三个元素是空的? 我认为第一个元组中的第二个和第三个元素是“。”和“tw”。
我有什么误解吗?
解决方法
@
([a-zA-Z0-9-.]
) 之后的第一个字符类包含字面量 .
并且它是贪婪匹配的,这意味着它会尽可能多地运行,而不是尽快停止可以。
您可以通过非贪婪匹配 ([...]+?
) 或删除点来避免这种情况,从而允许正则表达式的其余部分匹配。
代码:
>>> import re
>>> msg = '''txt@deepstone.com.tw kkk@gmail.com'''
>>> pattern2 = r'''(
... [a-zA-Z0-9_.]+
... @
... [a-zA-Z0-9-]+
... \.
... [a-zA-Z]{2,4}
... (\.)?
... ([a-zA-Z]{2,4})?
... )'''
>>> re.findall(pattern2,msg,re.VERBOSE)
[('txt@deepstone.com.tw','.','tw'),('kkk@gmail.com','','')]
>>> pattern3 = r'''(
... [a-zA-Z0-9_.]+
... @
... [a-zA-Z0-9-.]+?
... \.
... [a-zA-Z]{2,4})?
... )'''
>>> re.findall(pattern3,'')]