簡體   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