這看起來像一個簡單的正則表達式,沒有反向引用,沒有「任何」字符,我甚至不敢說湯姆森DFA和所有人都可以解析它。它甚至可以工作,但扼殺非常簡單的不匹配。爲什麼Python在這個正則表達式中扼殺?
{\s*?
ngx_string\("(?P<name>[a-z0-9_]+)"\)\s*?,\s*?
(?P<where>(([A-Z0-9_]+)\s*\|?)+?)\s*?,\s*?
(?P<bla>[^\n}]+?)\s*?,\s*?
(?P<bla2>[^\n}]+?)\s*?,\s*?
(?P<bla3>[^\n}]+?)\s*?,\s*?
(?P<bla4>[^\n}]+?)\s*?
}
+ re.MULTILINE | re.VERBOSE
我目前正在嘗試這種關於Python 2.7.8(但py3.4鏈接的要點也失敗了;還有的linux,X86-64,Ubuntu的,PCRE靜態鏈接中的[在最少/ proc //地圖不顯示任何有趣的東西)。
這解析得好:
{ ngx_string("daemon"),
NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
0,
offsetof(ngx_core_conf_t, daemon),
NULL },
而這其中的樂趣停止:
{ ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_OFF },
{ ngx_string("on"), NGX_HTTP_REQUEST_BODY_FILE_ON },
此外,越來越多的數據:
通過改變第二行此
(?P<where>(([A-Z0-9_]{1,20})\s*\|?){1,6}?)\s{0,10}?,\s{0,10}?
,它最終完成在合理的時間,但指數炸燬仍然存在,只是可以忍受的:(?模擬器)
trying { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE
Took 0.033483 s
trying { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_
Took 0.038528 s
trying { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_O
Took 0.044108 s
trying { ngx_string("off"), NGX_HTTP_REQUEST_BODY_FILE_OF
Took 0.053547 s
而且,有趣的是基於JS-Python的正則表達式解析器可以吃它,喜歡它的早餐PCRE冠軍:https://www.debuggex.com/r/S__vSvp8-LGLuCLQ
哦,也許有人應該創建pathological-regex標籤:
感謝您的詳細信息。所以看起來Python有它自己的Regex引擎。緩解手頭問題的任何提示? – PAStheLoD 2014-10-06 06:13:50
@PAStheLoD:看我的編輯。 – nhahtdh 2014-10-06 06:52:58