如何在一个反向查找捕获项regex之间捕获未知数量的单词?

2024-06-28 19:54:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图排除在单词“dog”之前有单词“owner”的记录

  • 主人有一条狗(不包括)
  • 主人有一只黑褐色的狗(不包括在内)
  • 约翰有一只狗(包括)
  • 约翰有一只黑褐色的狗(包括)

以下是当前的正则表达式:

\b(?<!owner\s)\w+\sdog\b

这适用于单个未知单词(“ownerhasdog”被排除在外,但“ownerhasdog”被包括在内)),但是,我无法捕捉到多个单词,这些单词在“owner”和“dog”之间的所有单词中保留其负面外观

非常感谢


Tags: 记录单词外观主人ownerdogsdog负面
2条回答

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

^(?:(?!\bowner\b).)*\bdog\b

Start your engine!<“\(ツ) /'>;Python code

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

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

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

另一个选项是开始匹配除o或换行符以外的任何字符

然后,如果您遇到一个o,则断言它不是单词所有者,然后匹配除o或换行符之外的任何字符,并有选择地重复该过程,直到匹配单词dog为止

 ^[^o\r\n]*(?:(?!\bowner\b)o[^o\r\n]*)*\bdog\b

解释

  • ^字符串的开头
  • [^o\r\n]*匹配0+乘以除o或换行符以外的任何字符
  • (?:非捕获组
    • (?!\bowner\b)负向前看,不要直接在右边断言单词owner
    • o[^o\r\n]*匹配o,后跟0+乘以除o或换行符以外的任何字符
  • )*关闭非捕获组并重复0+次
  • \bdog\b匹配单词dog

Regex demoPython demo

相关问题 更多 >