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
,后跟1+空格和not
子字符串sweet
-或|
-一个完整的单词\b(sweet\w*)\b
,后面有任何其他单词字符(您可以使用自己的模式,而不是sweet
)\w*
-使模式不区分大小写flags=re.I
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