PCRE正则表达式/..(?<=(.)\1)/
无法编译:“在后观断言中不允许使用子模式引用。”有趣的是,它似乎可以在前瞻中接受,例如/(?=(.)\1)../
,而不是外观。
是否存在技术上的原因,为什么特别是在后视镜中不允许反向引用?
答案 0 :(得分:3)
使用Python的re模块,lookbehind不支持组引用,即使它们匹配某些固定长度的字符串。
Lookbehinds并不完全支持PCRE规则。具体来说,当正则表达式引擎达到后视时,它会尝试确定它的大小,然后跳回来检查匹配。
此尺寸确定可让您选择:
因为第一个解决方案对我们(用户)来说是最好的,所以它显然是最慢的,也是最难开发的。因此对于PCRE正则表达式,他们决定使用第二种解决方案。另一个例子,Java正则表达式引擎允许半变量的lookbehinds:你只需要确定最大的大小。
我来到了PCRE和Python的模块 我在PCRE documentation中找不到任何其他错误代码:
编译错误代码
25:lookbehind断言不是固定长度
但在这种情况下,后方断言是固定长度 现在,我们可以在re documentation中找到以下内容:
包含的模式必须只匹配一些固定长度的字符串,这意味着允许使用abc或a | b,但a *和a {3,4}不允许。 即使它们匹配某些固定长度的字符串,也不支持组引用。
我们已经内疚......如果你愿意,你可以尝试Python's regex module ,它似乎支持可变长度的后视。