关于 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', '', '')]