为什么Python要花这么长时间处理我的Regex?

时间:2020-05-28 18:44:42

标签: python regex

我正在制作一个Python程序,该程序匹配字符串中的所有电子邮件并将其返回给用户:

emailRegex = re.compile(r'((.*)+@(.*)+\.(.*){3})')
text = "John Smith, Vice Provost for Undergraduate Studies\n123-456-7890\njohn.smith@email.edu"
emailList = emailRegex.findall(text)
clipOut = []
for tup in emailList:
     clipOut.append(tup[0])
print(clipOut)

我在没有任何输出的情况下运行了9分钟以上的程序

奇怪的是,将文本字符串更改为"John\n123-456-7890\njohn.smith@email.edu"会使正则表达式几乎立即匹配。

在文本字符串的第一行中添加更多文本会使Regex匹配花费的时间越来越长。字符串John Smith, Vice Provost\n123-456-7890\njohn.smith@email.edu在笔记本电脑上运行仅需10多秒钟。在电子邮件增加匹配速度之前减少字符数。更改使用的字符不会提高匹配速度。但是,删除所有新行都会使程序以预期的速度运行,而不管发送电子邮件之前的字符数如何。

最后,将正则表达式更改为:

emailRegex = re.compile(r'([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+(\.[a-zA-Z]{2,4}))')

使程序运行正常,而与字符串长度无关。

我了解我的Regex有缺陷,但是我不明白为什么它会导致我的程序花很长时间运行

1 个答案:

答案 0 :(得分:0)

错误可能是由+之后的(.*)引起的。将正则表达式更改为emailRegex = re.compile(r'((.+)@(.+)\.(.){2,4})')可使程序按预期运行。谢谢您的帮助!