正则表达式:如果单词B在A之前的某个位置,如何不匹配单词A.

时间:2018-03-15 20:54:07

标签: python regex

我正在使用python正则表达式引擎并尝试实现类似字符串foo,fou,bar,baz的功能。我希望匹配baz当且仅当fou不在其之前时。我在(<?!fou)baz后面尝试过负面看法,但它不起作用,因为它只适用于立即跟随。

2 个答案:

答案 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 [...]