[英]Python regular expressions with more than 100 groups?
有沒有辦法超過Python中正則表達式的100組限制? 此外,有人可以解釋為什么有一個限制。
存在一個限制因為它需要太多內存才能有效地存儲完整的狀態機。 我要說的是,如果你的組中有超過100個組,那么在re本身或你使用它們的方式上都有問題。 也許你需要拆分輸入並處理較小的塊或其他東西。
我找到了最簡單的方法
import regex as re
代替
import re
正則表達式的默認_MAXCACHE是500而不是100我相信。 這是我發現正則表達式比re更好的模塊的眾多原因之一。
如果我沒有弄錯的話,“新” 正則表達式模塊(目前是第三方,但最終會替換stdlib中的re模塊)沒有這個限制,所以你可以嘗試一下。
我懷疑你真的需要通過下一個命令處理100個命名組,或者在regexp
replacement命令中使用它。 這將是非常不切實際的。 如果您只需要組來表達regexp
的豐富條件,則可以使用非分組組。
(?:word1|word2)(?:word3|word4)
包括嵌套組在內的復雜場景也是可能的。 非分組組沒有限制。
我不確定你到底做了什么,但嘗試使用一個組,里面有很多OR子句...所以(這)|(那)變成(這個|那個)。 你可以通過傳遞一個與匹配的特定單詞做某事的函數來對結果做一些聰明的事情:
newContents, num = cregex.subn(lambda m: replacements[m.string[m.start():m.end()]], contents)
如果你真的需要這么多團體,你可能需要分階段進行...一次傳遞十幾個大組,然后另一個傳遞給每個組,以獲得你想要的所有細節。
首先,正如其他人所說,使用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組限制。
當我碰到這個時,我有一個非常復雜的模式,它實際上由一組由OR連接的高級模式組成,如下所示:
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)
我發現Python 3沒有這個限制,而最新2.7中運行的相同代碼顯示此錯誤。
在我的情況下,我有一個n字的字典,並希望創建一個匹配所有這些的正則表達式..即:如果我的字典是
hello
goodbye
我的正則表達式是: (^|\\s)hello($|\\s)|(^|\\s)goodbye($|\\s)
...這是唯一的方法,並且可以在小字典上正常工作,但是當你有更多的棕褐色50個字,那么...
我會說你可以通過使用非分組括號減少組的數量,但不管你做什么似乎都想要所有這些分組。
解決此錯誤非常容易:打開re
類,您將看到此常量_MAXCACHE = 100
。 例如,將值更改為1000
,然后進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.