1
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

当我使用这个网站的正则表达式时,它仍然运行得很慢。

我需要一个解决方案,并想知道出了什么问题。

4

3 回答 3

1

这是回溯的问题。阅读本文了解更多信息。

您可能想要拆分行并使用包含 @ 的部分:

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()
于 2012-06-15T17:08:44.340 回答
0

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

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

如果您可以处理正则表达式的这一部分以从括号中删除重复,您应该会看到速度显着提高。

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

于 2012-06-15T17:09:42.963 回答
0

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

使用正则表达式验证电子邮件地址

从那个讨论来看,这个对我来说看起来不错:

[a-zA-Z0-9.!#$%&'*+-/=?\^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*
于 2012-06-15T17:13:13.310 回答