请参阅我的正则表达式模式代码:
#!/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秒,模式有问题吗?
答案 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!