gpt4 book ai didi

python - 不要在字符串之前捕获

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:31 25 4
gpt4 key购买 nike

我有一系列要捕获的标记:

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) 会派上用场的原因。

这是一个Python snippet :

import re
s = '''sweet (capture)
SWEETENED (capture)
not sweet (do not capture)
bitterly sweet (do not capture)'''
print(filter(None, re.findall(r'\b(?:bitterly|not)\s+sweet|\b(sweet\w*)\b', s, flags=re.I)))
# => ['sweet', 'SWEETENED']

这里,

  • \b(?:bitterly|not)\s+sweet - 匹配整个单词 bitterlynot 后跟 1+ 个空格和sweet 子串
  • | - 或者
  • \b(sweet\w*)\b - 整个单词 sweet 后面有任何其他单词字符(您可以使用自己的模式而不是 \w*)
  • flags=re.I - 使模式不区分大小写。

参见 regex demo (只有代码才能保留绿色文本)。

方法 2:不允许对输入进行太多控制的后视

关于消极回顾方法的几句话:我认为在这种情况下它不是很好,因为 Python re 中的回顾是固定宽度的,并且回顾中的所有替代方案必须是相同的宽度。

你可能会用到

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

(参见 demo ),但如果在 bitterlysweet 之间有 2 或 3 个空格,它将失败。

方法 3:使用 PyPi 正则表达式模块进行可变宽度回顾

另一个有趣的解决方案是使用 PyPi 正则表达式模块,您可以在其中使用可变宽度后视:

import regex
s='''sweet (capture)
SWEETENED (capture)
not sweet (do not capture)
bitterly sweet (do not capture)'''
rx = r'(?<!\b(?:bitterly|not)\s+)\bsweet\w*\b'
print(regex.findall(rx, s, flags=regex.I))
# => ['sweet', 'SWEETENED']

参见 Python demo on REXTESTER .

仅当前面没有\b(?:bitterly|not)\s+ 模式时,才会匹配整个单词sweet(末尾有任何单词字符)

关于python - 不要在字符串之前捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44650653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com