我正在使用python正则表达式引擎并尝试实现类似字符串foo,fou,bar,baz
的功能。我希望匹配baz
当且仅当fou
不在其之前时。我在(<?!fou)baz
后面尝试过负面看法,但它不起作用,因为它只适用于立即跟随。
答案 0 :(得分:2)
re
模块不支持可变长度的lookbehinds,你需要使用regex
模块。
要使用re
模块获得所需内容,您可以使用否定前瞻匹配fou
并使用捕获的组获取baz
:
In [15]: str_ = 'foo,fou,bar,baz'
In [16]: re.search(r'^(?!.*fou.*baz).*(baz)', str_)
In [17]: str_ = 'foo,foz,bar,baz'
In [18]: re.search(r'^(?!.*fou.*baz).*(baz)', str_)
Out[18]: <_sre.SRE_Match object; span=(0, 15), match='foo,foz,bar,baz'>
In [19]: re.search(r'^(?!.*fou.*baz).*(baz)', str_).group(1)
Out[19]: 'baz'
在^(?!.*fou.*baz).*(baz)
:
零宽度否定前瞻(?!.*fou.*baz)
确保fou
在整个输入中baz
之前不会出现
.*(baz)
将baz
置于唯一捕获的群组中
答案 1 :(得分:0)
如果你想避免regex
开销,你甚至可以使用字符串方法。
string = """
foo,fou,bar,baz
foo,baz
baz, fou
neither nor"""
needle = "baz"
matches = [line
for line in string.split("\n")
for fou in [line.find('fou')]
for baz in [line.find(needle)]
if line and ((fou == -1 and baz > 0) or (baz < fou))]
print(matches)
# ['foo,baz', 'baz, fou']
要在列表推导中保存变量x
,您需要使用for x in [...]
。