如何从原始文本中提取有效的电子邮件地址?

时间:2019-05-30 22:59:00

标签: python regex regex-lookarounds regex-group email-validation

我尝试从原始电子邮件文本中提取有效的电子邮件地址。

我的电子邮件模式给出了一些良好的结果,但是在某些情况下,它没有给出相关的结果。

在我看来,当电子邮件地址周围没有适当的空格时,可能会出现此问题:这里有2个典型示例,说明我所获取的内容与无关的内容:

Another

实际上我的电子邮件格式如下:

current return                                           corrected return
Support123.456.7891erica.x.doe@century.comThis           erica.x.doe@century.com
HolmesSherlock.Holmes@cox.com                         Sherlock.Holmes@cox.com

如果可以的话,请您帮我改善电子邮件格式,以便直接获得“更正的退货”。

关于。

2 个答案:

答案 0 :(得分:1)

RFC5322正则表达式。这使用空白边界。

r"(?i)(?<!\S)(?=.{1,64}(?!\S))(?:(\"[^\"\\]*(?:\\.[^\"\\]*)*\"@)|((?:[0-9a-z](?:\.(?!\.)|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)?[0-9a-z]@))(?=.{1,255}(?!\S))(?:(\[(?:\d{1,3}\.){3}\d{1,3}\])|((?:(?=.{1,63}\.)[0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9])|((?=.{1,63}(?!\S))[0-9a-z][-\w]*))(?!\S)"

https://regex101.com/r/pT7uK0/1

扩展

 # Note - If possible, remove all comments '(comments)' before runninig this regex
 # Find  \([^)]*\)  replace with nothing

 (?i)                                      # Case insensitive

 (?<! \S )                                 # Local part
 (?=                                       # 64 max chars
      .{1,64} 
      (?! \S )
 )
 (?:
      (                                         # (1 start), Quoted
           " [^"\\]* 
           (?: \\ . [^"\\]* )*
           "
           @
      )                                         # (1 end)
   |                                          # or, 
      (                                         # (2 start), Non-quoted
           (?:
                [0-9a-z] 
                (?:
                     \.
                     (?! \. )
                  |                                          # or, 
                     [-!#\$%&'\*\+/=\?\^`\{\}\|~\w] 
                )*
           )?
           [0-9a-z] 
           @
      )                                         # (2 end)
 )
                                           # Domain part
 (?=                                       # 255 max chars
      .{1,255} 
      (?! \S )
 )
 (?:
      (                                         # (3 start), IP
           \[
           (?: \d{1,3} \. ){3}
           \d{1,3} \]
      )                                         # (3 end)
   |                                          # or,   
      (                                         # (4 start), Others
           (?:                                       # Labels (63 max chars each)
                (?= .{1,63} \. )
                [0-9a-z] [-\w]* [0-9a-z]* 
                \.
           )+
           [a-z0-9] [\-a-z0-9]{0,22} [a-z0-9] 
      )                                         # (4 end)
   |                                          # or,
      (                                         # (5 start), Localdomain
           (?=
                .{1,63} 
                (?! \S )
           )
           [0-9a-z] [-\w]* 
      )                                         # (5 end)
 )
 (?! \S )

答案 1 :(得分:0)

在这种情况下使用正则表达式是非常不可靠的。您可能会从完整的电子邮件中删除一部分(例如,如果您尝试解析出最后一个大写字母左侧的字符,则McDonald将是Donald)。

我的建议是,您只解析字符串中不能是真实电子邮件的部分。

[A-z\.]{6,}@[A-z\d-]+\.[a-z]{2,4}

此正则表达式假定最小的电子邮件用户名是6个字符(我相信这是大多数商业地址的标准名称)。此外,它假定用户名中只能包含字符或句点。该网站必须是大写或小写,连字符或数字,然后是句点,然后是2-4个小写字符。

我建议您最大程度地使用此方法,并且不要尝试对正则表达式更切肤,除非您可以保证不会发生这些最坏的情况。