关于 re.findall
About re.findall
下面是我的 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-.]
) 之后的第一个字符 class 包含文字 .
并且它是贪婪匹配的,这意味着它会尽可能地匹配而不是尽快停止。
您可以通过非贪婪匹配 ([...]+?
) 或删除点来避免这种情况,从而允许正则表达式的其余部分匹配。
代码:
>>> 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', '', '')]
下面是我的 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-.]
) 之后的第一个字符 class 包含文字 .
并且它是贪婪匹配的,这意味着它会尽可能地匹配而不是尽快停止。
您可以通过非贪婪匹配 ([...]+?
) 或删除点来避免这种情况,从而允许正则表达式的其余部分匹配。
代码:
>>> 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', '', '')]