我尝试从原始电子邮件文本中提取有效的电子邮件地址。
我的电子邮件模式给出了一些良好的结果,但是在某些情况下,它没有给出相关的结果。
在我看来,当电子邮件地址周围没有适当的空格时,可能会出现此问题:这里有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
如果可以的话,请您帮我改善电子邮件格式,以便直接获得“更正的退货”。
关于。
答案 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个小写字符。
我建议您最大程度地使用此方法,并且不要尝试对正则表达式更切肤,除非您可以保证不会发生这些最坏的情况。