我创建了这个正则表达式来清除明显错误的电子邮件地址。对于我的大型数据集,它适用于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
我已经广泛阅读并尝试了在([\.]|[\-])?
这样的正则表达式中创建另一个组的各种选项,但无济于事。有人可以帮忙吗?
答案 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})$
更具体的一个是
^(?![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})$