什么是从一个子字符串匹配到另一个子字符串的正则表达式,而中间没有另一个子字符串?

时间:2014-09-10 04:02:33

标签: python regex

我希望从子字符串foo匹配到子字符串bar,但两者之间没有子字符串baz。 (Python是首选,所以负面/正面前瞻是好的)

2 个答案:

答案 0 :(得分:2)

您可以尝试使用负前瞻的下面的正则表达式

foo(?:(?!baz).)*bar

DEMO

(?:(?!baz).)*告诉正则表达式引擎匹配任何字符零次或多次,但不匹配字符串buz

>>> import re
>>> s = """fooblahblahbar
... fooblahbazbar"""
>>> m = re.findall(r'foo(?:(?!baz).)*bar', s, re.M)
>>> m
['fooblahblahbar']

答案 1 :(得分:1)

另一种方式(不太方便,但效率更高,尤其是长字符串)

bear(?=((?:[^cd]+|c+(?!at)|d+(?!og))*))\1bar

此模式模拟python中不可用的功能:the atomic group

与原子组相同的模式是:bear(?>[^cd]+|c+(?!at)|d+(?!og))*dog

模拟此功能的技巧是使用前瞻断言是原子的事实(一旦达到右括号,就无法删除字符)。如果你把一个捕获组放在里面,然后你使用反向引用,你就获得了一个原子组:

(?>expression)    <=>    (?=(expression))\1

其中\1是反向引用。

此方法的局限性:

如果目标字符串包含高密度的第一个字符(示例中为“d”和“c”),这将减慢正则表达式引擎的工作速度,因为它有更多的测试要做(你松开了给出第一个贪心量词[^cd]+

的优点