如何捕获负向后查找术语正则表达式之间未知数量的单词?

Sea*_*ell 4 python regex data-mining

我试图排除在“狗”一词之前有“所有者”一词的记录

  • 业主有一只狗(不含)
  • 主人有一只黑棕色的狗(不含)
  • 约翰有一只狗(包括)
  • 约翰有一只黑色和棕色的狗(包括)

这是当前的正则表达式:

\b(?<!owner\s)\w+\sdog\b
Run Code Online (Sandbox Code Playgroud)

这适用于单个未知单词(排除“主人有狗”,但包括“主人狗”)),但是,我无法捕获多个单词,这些单词在“主人”和“主人”之间的所有单词中保留其负面外观。 “狗”。

非常感谢

Car*_*and 5

您可以使用以下正则表达式来验证字符串是否包含单词“dog”且前面没有单词“owner”。

\n
^(?:(?!\\bowner\\b).)*\\bdog\\b\n
Run Code Online (Sandbox Code Playgroud)\n

启动你的引擎! < \xc2\xaf\\ (\xe3\x83\x84) /\xc2\xaf > Python 代码

\n

Python 的正则表达式引擎执行以下操作。

\n
^                : anchor match to beginning of string\n(?:              : begin a non-capture group\n  (?!\\bowner\\b)  : use a negative lookahead to assert that the current\n                   position in the string is not followed by "owner"\n  .              : match a character\n)                : end non-capture group\n*                : execute non-capture group 0+ times\n\\bdog\\b          : match \'dog\' surrounded by word boundaries\n
Run Code Online (Sandbox Code Playgroud)\n

匹配不以非法单词开头的单个字符序列的技术称为“Tempered Greedy Token Solution”

\n

  • 很有意思。谢谢。消极的回顾似乎也有效。但我不明白的是为什么积极的向后查找与相反的集合不匹配 - 其中“owner”确实在“dog”之前?(很抱歉在评论中提出这个问题,如果您愿意,我可以分叉“分叉”原始问题。) (2认同)
  • 非常感谢你,你给了我很大的帮助 (2认同)
  • @Mark,如果“owner”必须在“dog”之前,则积极的向后查找将类似于“(?&lt;=\bowner\b.*)”。这是一个*可变长度*正向后查找,Python 的标准 `re` 模块不支持它。不过,Python 的 PyPI 正则表达式模块支持它。然而,更简单的是编写“\bowner\b.*\bdog\b”。 (2认同)