用于电子邮件地址的Python正则表达式,需要清除点划线

时间:2016-05-18 02:21:37

标签: python regex

我创建了这个正则表达式来清除明显错误的电子邮件地址。对于我的大型数据集,它适用于98%的案例。

pattern = re.compile('^([a-zA-Z0-9._-]+)([a-zA-Z0-9]@[a-zA-Z0-9])([a-zA-Z0-9.-]+)([a-zA-Z0-9]\.[a-zA-Z]{2,3})$')

问题所在的部分在这里:

([a-zA-Z0-9.-]+)

如果电子邮件地址在域中有短划线或句点,那也没关系,但我不希望连续允许这两个符号,例如.- or -.

例如,这些都可以(并且应该与正则表达式匹配):

chris@data.services.com
chris@data-services.com

但这不是(也不应该产生匹配):

chris@data.-services.com

我已经广泛阅读并尝试了在([\.]|[\-])?这样的正则表达式中创建另一个组的各种选项,但无济于事。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

您可以在此使用negative look ahead assertion

^(?!.*\.-.*$|.*-\..*$)([a-zA-Z0-9._-]+)([a-zA-Z0-9]@[a-zA-Z0-9])([a-zA-Z0-9.-]+)([a-zA-Z0-9]\.[a-zA-Z]{2,3})$

Regex explanation here

Regular expression visualization

更具体的一个是

^(?![a-zA-Z0-9._@-]*\.-[a-zA-Z0-9._@-]*$|[a-zA-Z0-9._-@]*-\.[a-zA-Z0-9._-@]*$)([a-zA-Z0-9._-]+)([a-zA-Z0-9]@[a-zA-Z0-9])([a-zA-Z0-9.-]+)([a-zA-Z0-9]\.[a-zA-Z]{2,3})$

如果..--...等不允许,您可以使用

^(?![a-zA-Z0-9._@-]*[.-]{2,}[a-zA-Z0-9._@-]*$)([a-zA-Z0-9._-]+)([a-zA-Z0-9]@[a-zA-Z0-9])([a-zA-Z0-9.-]+)([a-zA-Z0-9]\.[a-zA-Z]{2,3})$