我希望从子字符串foo
匹配到子字符串bar
,但两者之间没有子字符串baz
。 (Python是首选,所以负面/正面前瞻是好的)
答案 0 :(得分:2)
您可以尝试使用负前瞻的下面的正则表达式
foo(?:(?!baz).)*bar
(?:(?!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]+
)