为什么我的Python正则表达式模式运行得这么慢?

时间:2014-12-12 16:44:44

标签: python regex

请参阅我的正则表达式模式代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import re

print 'Start'
str1 = 'abcdefgasdsdfswossdfasdaef'
m = re.match(r"([A-Za-z\-\s\:\.]+)+(\d+)\w+", str1) # Want to match something like 'Moto 360x'
print m # None is expected.
print 'Done'

完成时需要49秒,模式有问题吗?

2 个答案:

答案 0 :(得分:7)

请参阅Runaway Regular Expressions: Catastrophic Backtracking

简而言之,如果有很多组合可以将子字符串拆分为正则表达式的各个部分,则正则表达式匹配器最终可能会尝试全部。

(x+)+x+x+这样的构造实际上保证了这种行为。

要检测并修复有问题的构造,可以使用以下概念:

  • 在概念层面,存在问题构造意味着你的正则表达式是不明确的 - 即如果你忽视贪婪/懒惰的行为,就没有单一的“正确”分裂一些文本到正则表达式的部分(或等效地,它的子表达式)。因此,为了避免/解决问题,您需要查看并消除所有歧义。

    • 执行此操作的一种方法是

      • 始终将文本拆分为有意义的部分(=对手头任务有不同含义的部分),
      • 以不会混淆的方式定义部件(=使用您自己用来判断哪个是手动解析的相同特性)

答案 1 :(得分:0)

在nhahtdh和Marc B的评论中重新发布答案和解决方案:

([A-Za-z\-\s\:\.]+)+ - > [A-Za-z\-\s\:\.]+

非常感谢nhahtdh和Marc B!