【问题标题】:regex for email parsing in python用于在 python 中解析电子邮件的正则表达式
【发布时间】:2016-04-11 08:40:52
【问题描述】:

我被要求编写可以捕获多域电子邮件地址并在 python 中实现它的正则表达式。所以我想出了以下正则表达式(和代码;重点是正则表达式),我认为这是正确的:

import re
regex = r'\b[\w|\.|-]+@([\w]+\.)+\w{2,4}\b'
input_string = "hey my mail is abc@def.ghi"
match=re.findall(regex,input_string)
print match

现在,当我运行它(使用非常简单的邮件)时,它没有捕捉到它! 相反,它显示一个空列表作为输出。谁能告诉我正则表达式文字哪里出错了?

【问题讨论】:

  • 谷歌这个!上面有很多内容。即使在 SO 上。
  • 我知道有大量的复制粘贴电子邮件正则表达式,但这个问题正在伤害我的大脑;知道正则表达式是正确的,但它不起作用。
  • a) 它不输出空字符串,它输出['def.'](这是您使用() 捕获的唯一位)。 b) 正则表达式不正确,您不能像在字符类中那样使用 | - 在 [] 内它从字面上匹配管道字符,它不做非此即彼,\b 不在字符串末尾匹配,并且对于像 example@example.google 这样没有 2-4 位 TLD 的地址,正则表达式被破坏。
  • 在@TessellatingHeckler 的注释之上,如果您有捕获组,findall 返回捕获组,而不是完整匹配。将 ([\w]+\.) 更改为 (?:\w+\.) 以将括号更改为非捕获(同时删除多余但无害的括号;\w 本身就是一个字符类)。

标签: python regex email expression


【解决方案1】:

这是一个简单的开始

regex = r'\b[\w.-]+?@\w+?\.\w+?\b'
re.findall(regex,input_string)  # ['abc@def.ghi']

您原来的问题是您不需要在字符类 ([..]) 中使用 | 运算符。只需将[\w|\.|-] 写为[\w.-] 即可(如果- 在末尾,则无需转义)。

其次,合法域名的变体太多了。只需在@ 符号后寻找至少一个被单词字符包围的句点:

@\w+?\.\w+?\b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多