Python 具有可变字符数的否定回顾

Python Negative Lookbehind with a variable number of characters

我知道有很多正则表达式和负面的回顾问题,但我有一个找不到答案。我想找到 water 的实例,但如果它前面有 never 且两者之间的字符数不定,则不会。这两个词之间有无限多个可变字符,lookbehind 不允许可变字符。我有永远不会找到的代码,但它永远不会在脚本的开头找到。 有没有办法将回溯限制为 20 或 30 个字符? 我有什么:

(?i)^(?=.*?(?:water))(?:(?!never).)*$

只是我正在使用的一些示例:

water                                                         (match)
I have water                                                  (match)
I never have water
Where is the water.                                           (match)
I never have food or water
I never have food but I always have water                     (match)
I never have food or chips. I like to walk. I have water      (match)

同样,问题是我可以有一个 10 句长的段落,如果它有 never 任何地方都找不到 water 并且lookbehind 和lookahead 不接受变量字符。感谢您提供的任何帮助。

Python 不支持具有可变字符数的否定回顾。你可以做的是检查“never is before water”,在这种情况下 return False。例如:

def test(string):
    if re.match('.*never.*water.*', string):
        return False
    elif re.match('.*water.*', string):
        return True
    else:
        # return False?
        return False

您可以在 Python 的内置 re 模块中使用此正则表达式:

(?i)^(?!.*\bnever\b.{,20}\bwater\b).*\bwater\b

RegEx Demo

正则表达式详细信息:

  • (?i): 启用忽略大小写模式
  • ^: 开始
  • (?!.*\bnever\b.{,20}\bwater\b):负先行条件。如果单词 never 出现在单词 water.
  • 之前的 20 个字符以内,这将导致匹配失败
  • .*\bwater\b:在行
  • 中的任意位置查找单词water