下面是我的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}
... (.)?
... ([a-zA-Z]{2,4})?
... )'''
>>> re.findall(pattern3, msg, re.VERBOSE)
[('txt@deepstone.com.tw', '.', 'tw'), ('kkk@gmail.com', '', '')]