具有可变字符数的 Python 负向后查找

标签 python regex lookbehind

我知道有很多正则表达式和负向回顾问题,但我有一个找不到答案。我想查找 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 句话长的段落,如果其中有从不任何地方,它就不会找到并且回望并且lookahead不接受可变字符。感谢您提供的任何帮助。

最佳答案

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

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

RegEx Demo

正则表达式详细信息:

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

关于具有可变字符数的 Python 负向后查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69453358/

相关文章:

python - 更改 SVG Python 中的路径类名称

Python:用字典项中所有可能的值替换每个字母

javascript - 使用javascript替换字符串值并保留部分替换字符串

mysql - 如何强制执行自定义 MySQL 列格式

r - 字符串替换为正则表达式条件

java - 如何使用前瞻和后视来创建自定义边界匹配器?

正则表达式:在模式中匹配模式 - 我想我需要使用 Positive Lookbehinds?

python - 使用 resample 为 pandas 数据框中的不同列聚合具有不同规则的数据

python - PEP8 用于长方法的名称

javascript - "SyntaxError: unterminated regular expression literal"使用 (?<= 后向断言