繁体   English   中英

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

[英]Why my Python regular expression pattern run so slowly?

请查看我的正则表达式模式代码:

#!/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秒,模式有什么问题吗?

请参阅失控正则表达式:灾难性回溯

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

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

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

  • 在概念层面,有问题的构造的存在意味着你的正则表达式是模糊的 - 即如果你忽略了贪婪/懒惰的行为,那么某些文本没有单独的“正确”分割成正则表达式的部分 (或者,等效地,其子表达式) )。 因此,为避免/解决问题,您需要查看并消除所有歧义。

    • 一种方法是

      • 总是将文本分成有意义的部分 (=对当前任务具有不同含义的部分),并且
      • 以这样的方式定义部件,使它们不会混淆(=使用你自己用来判断哪个特性,如果你手工解析它)

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

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

非常感谢nhahtdh和Marc B!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM