我試圖想出一個Python中的正則表達式,它必須匹配任何字符,但避免三個或更多個連續的逗號或分號。換句話說,只允許連續使用兩個逗號或分號。使用正則表達式的100%CPU使用率取決於輸入長度
原來這就是我目前有:
^(,|;){,2}([^,;]+(,|;){,2})*$
而且似乎按預期方式工作:
>>> r.match('')
<_sre.SRE_Match object at 0x7f23af8407e8>
>>> r.match('foo,')
<_sre.SRE_Match object at 0x7f23af840750>
>>> r.match('foo, a')
<_sre.SRE_Match object at 0x7f23af8407e8>
>>> r.match('foo, ,')
<_sre.SRE_Match object at 0x7f23af840750>
>>> r.match('foo, ,,a')
<_sre.SRE_Match object at 0x7f23af8407e8>
>>> r.match('foo, ,,,')
>>> r.match('foo, ,,,;')
>>> r.match('foo, ,, ;;')
<_sre.SRE_Match object at 0x7f23af840750>
但正如我開始增加輸入文本的長度,正則表達式似乎需要更多的時間來回應。
>>> r.match('foo, bar, baz,, foo')
<_sre.SRE_Match object at 0x7f23af8407e8>
>>> r.match('foo, bar, baz,, fooooo, baaaaar')
<_sre.SRE_Match object at 0x7f23af840750>
>>> r.match('foo, bar, baz,, fooooo, baaaaar,')
<_sre.SRE_Match object at 0x7f23af8407e8>
>>> r.match('foo, bar, baz,, fooooo, baaaaar,,')
<_sre.SRE_Match object at 0x7f23af840750>
>>> r.match('foo, bar, baz,, fooooo, baaaaar,,,')
>>> r.match('foo, bar, baz,, fooooo, baaaaar,,,,')
>>> r.match('foo, bar, baz,, fooooo, baaaaar, baaaaaaz,,,,')
最後,它完全停留在這個階段,CPU使用率高達100%。
我不確定是否可以對正則表達式進行優化,或者還有其他內容涉及到任何幫助。
PyPI上的正則表達式實現不太容易出現這種問題。 – MRAB 2011-06-03 18:28:32
Thas是一個很好的解釋,很高興知道問題的根源。我想我現在要進行反向檢查並放棄正則表達式。謝謝!! – julen 2011-06-04 08:12:11