这看起来像一个简单的正则表达式,没有反向引用,没有“任何”字符,我甚至不敢说汤姆森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