查找快速匹配电子邮件正则表达式

时间:2012-06-15 16:59:01

标签: python

solution:[a-zA-Z0-9.!#$%&'*+-/=?\^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)* is a good choice

我正在使用如下的正则表达式来匹配文件中的电子邮件地址:

email = re.search('(\w+-*[.|\w]*)*@(\w+[.])*\w+',line)

在如下文件中使用时,我的正则表达式效果很好:

mlk407289715@163.com    huofenggib  wrong in get_gsid
mmmmmmmmmm776@163.com   rouni816161 wrong in get_gsid

但是当我在下面这样的文件上使用它时,我的正则表达式运行速度慢得令人无法接受:

9b871484d3af90c89f375e3f3fb47c41e9ff22  mingyouv9gueishao@163.com
e9b845f2fd3b49d4de775cb87bcf29cc40b72529e   mlb331055662@163.com

当我使用this website中的正则表达式时,它仍然运行得很慢。

我需要一个解决方案,想知道什么是错的。

3 个答案:

答案 0 :(得分:1)

这是回溯的问题。请阅读this article以获取更多信息。

您可能希望拆分该行并使用包含@:

的部分
pattern = '(\w+-*[.|\w]*)*@(\w+[.])*\w+'
line = '9b871484d3af90c89f375e3f3fb47c41e9ff22  mingyouv9gueishao@163.com'
for element in line.split():
    if '@' in element:
        g = re.match(pattern, element)
        print g.groups()

答案 1 :(得分:0)

通常,当正则表达式很慢时,它归因于catastrophic bactracking。这可能发生在您的正则表达式中,因为在以下部分中嵌套重复:

(\w+-*[.|\w]*)*

如果您可以使用正则表达式的这一部分来删除括号内的重复,那么您应该会看到显着的速度提升。

但是,您最好只搜索电子邮件正则表达式并了解其他人是如何解决此问题的。

答案 2 :(得分:0)

搜索StackOverflow以查看您的问题是否已经过讨论总是一个好主意。

Using a regular expression to validate an email address

从讨论开始,这个对我来说看起来很好:

[a-zA-Z0-9.!#$%&'*+-/=?\^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*