在or运算符后面使用负向后搜索不以多个单词开头

问题描述

我的Python正则表达式有问题。

et仅在不带有mmme

的情况下才可以匹配

字符串:M et Mme Du PontMme et M Du Pont

regex:'\b(?<!m|mme)\bet\b'

错误look-behind requires fixed-with patterd

我该如何解决

'\b(?<!m)(?<!mme)\bet\b'似乎也不起作用

解决方法

除了错误之外,示例数据中mmme之后还有一个空格,该空格在模式中缺失。

另一种选择是使用regex PyPi module并进行单向查找,以断言直接在左边的是m,可以选择后面跟着me和空格。

\b(?<!m(?:me)? )et\b

Regex demo | Python using regex module demo

例如

import regex

pattern = r"\b(?<!m(?:me)? )et\b"
s = ("M et Mme Du Pont or Mme et M Du Pont\n"
            "et\n"
            "met")

print(regex.findall(pattern,s,regex.IGNORECASE))

输出

['et']
,

您可以使用以下2个否定的向后断言:

(?<!\bM )(?<!\bMme )\bet\b

RegEx Demo

MMme之后的空格很重要,因为在输入中et之前有一个空格。

RegEx详细信息:

  • (?<!\bM ):如果我们在当前位置之前有"M "字符串,则负向后搜索失败将导致匹配失败
  • (?<!\bMme ):如果我们在当前位置之前有"Mme "字符串,则负向后搜索失败将导致匹配失败
  • \bet\b:匹配完整词et