正则表达式无法识别带有特殊字符的电子邮件吗?

时间:2017-09-11 13:16:06

标签: regex email

问题:

我写了一个正则表达式来识别文本中的电子邮件地址。但它没有识别出像-这样的特殊字符的电子邮件。所以我修改了正则表达式以匹配带有特殊字符的电子邮件。现在它不匹配正常email.s

regex = r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?"

TEXT ="要解析的地址是bilgi"

DETECT = "bilgi@kleintoys.com"
NOT_DETECT = "bilgi@klei-ntoys.com"

修改:

regex = r"\"?([-a-zA-Z0-9.`?{}]+@\w+\-+\w+\.\w+)\"?"

TEXT ="要解析的地址是bilgi"

DETECT = "bilgi@klei-ntoys.com"
NOT_DETECT = "bilgi@kleintoys.com"

是否有正则表达式结合这两个正则表达式来匹配两个电子邮件。 喜欢

bilgi@klei-ntoys.com
bilgi@kleintoys.com

3 个答案:

答案 0 :(得分:1)

你可以制作一个更宽松的正则表达式。 这是一个匹配两个地址的命题:

[a-zA-Z\d]+@.+\..{,3}

让我们分解一下:

[a-zA-Z\d]+@.+\.[a-zA-Z\d]{,3}

[a-zA-Z\d]                        Match any alphanumerical character...
          +                       ... at least once
           @                      Match the arobase
            .+                    Match any character at least once...
              \.                  ... before a dot
                [a-zA-Z\d]{,3}    Then check at least three alphanumerical characters

使用Python检查:

>>> import re    
>>> s = "bilgi@kle-intoys.com"    
>>> re.match("[a-zA-Z\d]+@.+\.[a-zA-Z\d]{,3}", s)
<_sre.SRE_Match object; span=(0, 20), match='bilgi@kle-intoys.com'>

>>> s = "bilgi@kleintoys.com"
>>> re.match("[a-zA-Z\d]+@.+\.[a-zA-Z\d]{,3}", s)
<_sre.SRE_Match object; span=(0, 19), match='bilgi@kleintoys.com'>

答案 1 :(得分:1)

要使您的模式有效,您需要添加一个与-的0 +序列匹配的部分,然后添加一个或多个单词字符(?:-\w+)*

"?([-a-zA-Z0-9.`?{}]+@\w+(?:-\w+)*\.\w+)"?
                         ^^^^^^^^^

请参阅regex demo

<强>详情

  • "? - 可选的"
  • ([-a-zA-Z0-9.`?{}]+@\w+(?:-\w+)*.\w+) - 第1组(re.findall将输出的内容):
    • [-a-zA-Z0-9.`?{}]+ - 字符类中定义的一个或多个字符(-,ASCII字母,数字,.`?,{{ 1}},{(请注意,您可能希望将此部分限制为以任何字母开头,然后匹配},例如_
    • [^\W\d_][-\w.`?{}]* - @
    • @ - 1个或多个字母/数字/ \w+
    • _ - 0 + (?:-\w+)*的序列,然后是1个或多个字母/数字/ -
    • _ - 一个点
    • \. - 1个或多个字母/数字/ \w+
  • _ - 可选的"?

Python demo

"

答案 2 :(得分:0)

使用ipdb.pm()代替*

+

连字符匹配零次或多次后的星号。你有一个加号,至少匹配一个连字符。顺便说一下,您可以使用r"\"?([-a-zA-Z0-9.`?{}]+@\w+\-*\w+\.\w+)\"?" 代替\-*。在方括号之间,可以插入除[-]*之外的任何其他特殊字符。