2009-01-25 34 views
17

有沒有辦法在Python中擊敗正則表達式的100組限制?另外,有人可以解釋爲什麼有一個限制。謝謝。超過100個組的Python正則表達式?

+0

哇!100是一個正則表達式的大數字:O – 2009-01-25 22:52:12

+0

再次,我希望我敢於標記這個你不想要這個。 – phihag 2009-01-27 00:42:43

+1

你能解釋爲什麼你需要超過100個組?也許我們可以幫助您找到替代解決方案。 – Suraj 2009-01-26 21:45:49

回答

3

我不確定你在做什麼,但是嘗試使用一個組,內部有很多OR子句......所以(this)|(that)變成(this | that)。你可以通過做一些事是匹配特定的詞的功能做的結果聰明的事情:

newContents, num = cregex.subn(lambda m: replacements[m.string[m.start():m.end()]], contents) 

如果你真的需要這麼多的羣體,你可能必須做的階段..一次打十幾個大組,然後在每個組裏面傳遞你想要的所有細節。

10

有一個限制,因爲它會花費太多內存來有效地存儲整個狀態機。我想說,如果你有超過100個團體,無論是在本身還是在使用它們的方式上都有問題。也許你需要分割輸入並在更小的塊上工作。

+0

我同意你的看法。如果你碰到100組正則表達式的限制,我認爲設計有問題。 – 2009-01-25 23:09:48

+13

對不起,但我不同意 - 什麼是「太多的內存」,爲什麼模塊應該硬編碼這個閾值?有這種用法是合理的(罕見)情況。我(可惜)自己也遇到過這種情況。我正在用pyparsing解析一個複雜的語法,(唉)發現pyparsing太慢了。我現在自動生成一個正則表達式來匹配我的語法(並且我打了硬編碼的`100`磚牆)。 – 2011-04-05 21:07:13

+0

我也在使用自動生成的RegExps,但要檢查某些文件是否包含文件。每個文件用or(`|`)運算符分隔,然後使用`((caalog1 /)?catalog2 /)file.hh`搜索文件,如果文件的相對路徑是`catalog1/catalog2/file.hh`。這是因爲我想匹配`file.hh`,`catalog2/file.hh`和`catalog1/catalog2/file.hh`。由於我有相當多的文件要檢查,這成爲相當多的組... – HelloGoodbye 2014-01-27 09:25:51

-1

我會說你可以通過使用非分組圓括號來減少組的數量,但無論你在做什麼似乎你想要所有這些分組。

2

首先,正如其他人所說,使用100組可能是很好的選擇。 re.findall方法可能是一個有用的開始。如果您確實需要超過100個組,我所看到的唯一解決方法是修改核心Python代碼。

[python-install-dir]/lib/sre_compile.py簡單地通過去除以下行修改compile()功能:

# in lib/sre_compile.py 
if pattern.groups > 100: 
    raise AssertionError(
     "sorry, but this version only supports 100 named groups" 
     ) 

對於一個稍微柔性版,只是定義一個常數在sre_compile模塊的頂部,並具有上述線比較該常數而不是100.

有趣的是,在(Python 2.5)源代碼中有一條評論,指出100組限制將在未來的版本中被刪除。

+3

我會勸阻任何人修改標準庫,因爲這會導致應用程序只能在本地安裝。這導致維護噩夢。 – HelloGoodbye 2014-01-29 08:04:05

-1

在我的情況,我有N個字的字典,並希望建立一個滿足所有這些單一的正則表達式..即:如果我的字典是

hello 
goodbye 

我正則表達式是:(^|\s)hello($|\s)|(^|\s)goodbye($|\s) ..這是唯一的辦法,並且在小字典上可以正常工作,但是如果你有更多的坦率50字,那麼...

5

如果我沒有弄錯,「新」regex模塊黨,但打算最終取代stdlib中的重新模塊)沒有這個限制,所以你可以試試看。

-2

解決此錯誤非常容易: 打開re類,您將看到此常數_MAXCACHE = 100。例如,將值更改爲1000,然後進行測試。

5

我發現最簡單的方法是

import regex as re 

,而不是

import re 

對正則表達式的默認_MAXCACHE是500而不是100,我相信。這是我發現正則表達式比re更好的原因之一。

0

當我碰到這個我有實際上由被手術室加入了一堆高層次模式的非常複雜的圖案,像這樣:

pattern_string = u"pattern1|" \ 
    u"pattern2|" \ 
    u"patternN" 
pattern = re.compile(pattern_string, re.UNICODE) 

for match in pattern.finditer(string_to_search): 
    pass # Extract data from the groups in the match. 

作爲一種變通方法,我把圖案成列表和我使用了列表如下:

pattern_strings = [ 
    u"pattern1", 
    u"pattern2", 
    u"patternN", 
] 
patterns = [re.compile(pattern_string, re.UNICODE) for pattern_string in pattern_strings] 

for pattern in patterns: 
    for match in pattern.finditer(string_to_search): 
     pass # Extract data from the groups in the match. 
    string_to_search = pattern.sub(u"", string_to_search) 
5

我懷疑你真的需要在明年的命令處理100個命名的組或regexp替換命令中使用它。這將是非常不切實際的。如果您只需要羣組來表示regexp中的豐富條件,則可以使用非分組組。

(?:word1|word2)(?:word3|word4) 

等複雜場景,包括嵌套組是可能的。 非分組組沒​​有限制。