Python/PHP/JavaScript中是否有支持可变长度向后断言的正则表达式实现?
/(?<!foo.*)bar/
如何编写一个正则表达式,它具有相同的含义,但不使用回顾后发断言呢?
这种类型的断言会在将来实现吗?
事情比我想象的要好得多。
更新:
(1) 已经有支持可变长度回顾后发断言的正则表达式实现。
Python模块regex(不是标准的re
模块,而是额外的regex
模块)支持这些断言(还有许多其他很酷的功能)。
>>> import regex
>>> m = regex.search('(?<!foo.*)bar', 'f00bar')
>>> print m.group()
bar
>>> m = regex.search('(?<!foo.*)bar', 'foobar')
>>> print m
None
对我来说,真的很惊讶的是正则表达式中Perl不能做到而Python可以做到某些事情。可能,Perl也有“增强正则表达式”实现吗?
(感谢MRAB并点赞+1)。
(2) 现代正则表达式中有一个很酷的功能\K
。
这个符号表示当您进行替换(从我的角度来看,断言最有趣的用例是替换)时,在\K
之前找到的所有字符都不得更改。
s/unchanged-part\Kchanged-part/new-part/x
这几乎就像一个向后查找断言,但当然不那么灵活。
关于 \K
更多信息:
据我所知,在同一正则表达式中不能两次使用 \K
。而且你无法确定要“杀死”找到的字符的终止点。这总是到行的开头。
(感谢 ikegami 提供解答并进行点赞 +1)。
我的额外问题:
- 是否可以指定
\K
生效的最终位置? - 对于 Perl/Ruby/JavaScript/PHP 的增强正则表达式实现,有什么类似 Python 的
regex
的东西吗?
\K
技巧,我觉得它真的很厉害。 - Igor Chubin(?:(?!foo).)*
дјҡжӣҙжңүж•ҲпјҲжҲ–иҮіе°‘дёҚдјҡжӣҙе·®пјүеҗ—пјҹ - Igor Chubin