2010-01-04 87 views
4

在Python正則表達式,Python的正則表達式的源字符串長度

re.compile("x"*50000) 

給我OverflowError: regular expression code size limit exceeded

但下面一個沒有得到任何錯誤,但它擊中100%的CPU,並且耗時1分我PC

>>> re.compile(".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000) 
<_sre.SRE_Pattern object at 0x03FB0020> 

這是正常的嗎?

我應該承擔,".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000"x"*50000短?

測試在Python 2.6中,Win32的

更新1

它看起來像".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000可以減少.*?

那麼,這個怎麼樣?

re.compile(".*?x"*50000) 

它編譯,如果一個也可以減少".*?x",它應該匹配字符串"abcx""x"獨自一人,但它不匹配。

所以,我缺少的東西?

更新2

我的觀點是不知道正則表達式源字符串的最大限制,我想知道一些原因/溢流處理程序捕獲的"x"*50000概念,但不是在".*?x"*50000

它沒有意義對我來說,這就是原因。

它缺少的東西上溢檢查或它只是罰款或者它真的四溢的東西嗎?

任何提示/意見將不勝感激。

+0

否「。*?x」* 5000不會減少爲「。*?x」 - 它減少到5000 x的正則表達式,並帶有「。*?」在每個x之前。這就是爲什麼它不匹配「abcx」或「x」 - 它只能匹配5000個字符串。 – 2010-01-04 09:34:02

+1

它提醒我,當我嘗試將SVN路徑的ABNF轉換爲正則表達式時,我打了一次PHP的正則表達式的最大長度。所以,恕我直言,答案將是很好的知道。 – Boldewyn 2010-01-04 09:35:55

+0

@Dave Kirby,謝謝,但它的50000(50k)。我原來的問題是're.compile(「x」* 50000)'沒有被編譯,但是're.compile(「。*?x」* 50000)'被編譯。 – YOU 2010-01-04 09:37:04

回答

6

不同之處在於".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000可以減少到".*?",而"x"*50000必須在FSM(或由正則表達式引擎使用的類似結構)中生成50000個節點。

編輯:好吧,我錯了。這並不聰明。 "x"*50000失敗的原因,但".*?x"*50000不是因爲一個「代碼項目」的大小有限制。 "x"*50000會生成一個長項目,而".*?x"*50000會生成很多小項目。如果你可以在不改變正則表達式的意義的情況下分割字符串,它就可以工作,但我想不出一種方法來實現這一點。

+0

謝謝,但re.compile(「。*?x」* 50000)''怎麼樣? – YOU 2010-01-04 09:11:13

+0

我真的不知道關於Python正則表達式引擎的內幕,所以我不確定。正則表達式應該匹配50000個x和它們之間的任何字符。我不知道它做了什麼最優化,但它可能會對正則表達式做一些特殊的處理。僅供參考,所有正則表達式都適用於Linux。 – 2010-01-04 09:37:59

+0

感謝有關linux版本的信息,我剛剛檢查了_sre.c - > _compile函數,沒有針對windows的特定代碼,所以它可能是因爲一些大小不同的像'wchar_t'和/或你的python是用'Unicode編譯的= UCS4' – YOU 2010-01-04 10:12:03

1

你想匹配50000「x」s,正確嗎?如果是這樣,沒有正則表達式的替代

if "x"*50000 in mystring: 
    print "found" 
如果你想匹配50000「×」使用正則表達式

,你可以在我的系統上使用範圍

>>> pat=re.compile("x{50000}") 
>>> pat.search(s) 
<_sre.SRE_Match object at 0xb8057a30> 

它會在長度65535最大

>>> pat=re.compile("x{65536}") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/re.py", line 188, in compile 
    return _compile(pattern, flags) 
    File "/usr/lib/python2.6/re.py", line 241, in _compile 
    p = sre_compile.compile(pattern, flags) 
    File "/usr/lib/python2.6/sre_compile.py", line 529, in compile 
    groupindex, indexgroup 
RuntimeError: invalid SRE code 
>>> pat=re.compile("x{65535}") 
>>> 

我不知道是否有Python的調整,我們可以用它來增加這個限制。

+1

+1謝謝,但我正在尋找原因,爲什麼對於正則表達式 – YOU 2010-01-04 09:24:42

+0

感謝代碼的更新,但{65535}'是重複限制,這與我的有點不同。 ''x「* 50000'和'」x {50000}'在我的理解中是不同的 – YOU 2010-01-04 09:57:25

+0

「x」* 50000會產生50000個x ..在正則表達式中,如果您放入x {50000},那麼您告訴正則表達式引擎搜索50000 x的...或者我錯過了什麼?你應該清楚地說明你想要在你的問題中做什麼用例子... – ghostdog74 2010-01-04 10:27:01

相關問題