Python 不要在字符串之前捕获

Python 不要在字符串之前捕获,python,regex,Python,Regex,我有一系列要捕获的令牌: sweet (capture) SWEETENED (capture) not sweet (do not capture) bitterly sweet (do not capture) 现在,我编写了这个正则表达式,但它不符合我的要求: ^(?!not)^(?!bitterly)(sweet|SWEET|Sweet)(ed|ED)? 此表达式不包含任何术语。我应该使用什么前瞻性来捕捉这一点 另外,我正在使用Python实现这一方法1:匹配并捕获您需要的内容,然

我有一系列要捕获的令牌:

sweet (capture)
SWEETENED (capture)
not sweet (do not capture)
bitterly sweet (do not capture)
现在,我编写了这个正则表达式,但它不符合我的要求:

 ^(?!not)^(?!bitterly)(sweet|SWEET|Sweet)(ed|ED)?
此表达式不包含任何术语。我应该使用什么前瞻性来捕捉这一点

另外,我正在使用Python实现这一方法1:匹配并捕获您需要的内容,然后只匹配其余内容 您可以利用
re.findall
,它仅在模式中定义了捕获组时返回捕获组值。您只需要匹配您想要忽略的内容,并匹配和捕获您需要获得的内容。但是,当捕获组无法匹配时,它也会返回空元素,这就是为什么
filter(None,results)
会派上用场的原因

以下是一份:

这里,

  • \b(?:bitterly | not)\s+sweet
    -匹配整个单词
    bitterly
    not
    ,后跟1+空格和
    sweet
    子字符串
  • |
    -或
  • \b(sweet\w*)\b
    -一个完整的单词
    sweet
    ,后面有任何其他单词字符(您可以使用自己的模式,而不是
    \w*
  • flags=re.I
    -使模式不区分大小写
请参阅(绿色文本仅因代码而保留)

方法2:lookbehind不允许对输入进行太多控制 关于消极的lookbehind方法,我想在这种情况下不太好,因为Python
re
中的lookbehind是固定宽度的,并且lookbehind中的所有备选方法都必须具有相同的宽度

你可以用

(?i)(?<!\bbitterly )(?<!\bnot )\bsweet\w*


整个单词
sweet
(末尾有任何单词chars)只有在前面没有
\b(?:bittery | not)\s+
模式时才匹配。

除了@Wiktor模仿
(*SKIP)(*FAIL)
的答案之外,你可能还和neg相处得很好。展望:

(?!.*\b(?:not|bitterly))(?i)sweet(?:ened)?
请参阅。

缺点(可能?):没有考虑到
not
bitterly
的位置,因此

sweet and not sour

不会匹配的。这取决于您决定是否需要这样做。

有2或3种方法。您是提取还是替换,但我不是最好的。嘿!我正在提取:),然后尝试
filter(无,re.findall(r'\b(?:bitterly | not)\s+sweet |\b(sweet\w*)),s,flags=re.i)
,请参阅。。如果使用
regex
模块,你也可以添加
(*SKIP)(*FAIL)
作为一个例子(虽然我只能向上投票一次:)@Jan,我在.NET中编写代码已经有几年了,我习惯于向后看而不是
(*SKIP)(*F)
。也许这更有效,但这已经是“语法糖”:
(?!.*\b(?:not|bitterly))(?i)sweet(?:ened)?
sweet and not sour