python - 在正则表达式中使用 \b,尽量不匹配以 $ 开头的单词
问题描述
我无法使用负前瞻获得所需的输出。
import re
text = "$FOO FOO $BAR BAR"
# Expected. Return words without 'F'.
re.findall(r"\b(?!F)\w+", text)
> ['BAR', 'BAR']
# Expected. Return words without 'B'.
re.findall(r"\b(?!B)\w+", text)
> ['FOO', 'FOO']
# Unexpected. Return words without '$'.
re.findall(r"\b(?!\$)\w+", text)
> ['FOO', 'FOO', 'BAR', 'BAR']
前两个按预期工作。我希望最后一个返回['FOO', 'BAR']
没有“$”字符的列表匹配单词。因为它是一个特殊字符,所以我尝试了各种方法来逃避它,但没有找到正确的解决方案。
解决方案
您实际上需要通过以下方式修复模式:
\b(?<!\$)\w+
请参阅Python 演示。
原因是\b(?!\$)\w+
等于,\b\w+
因为$
不能与 匹配\w
,因此无需限制\w
与(?!\$)
负前瞻匹配的第一个字符。您需要限制紧接在第一个匹配 wit 的 char之前出现的 char \w
,这是通过负面的后视来完成的,在这里,(?<!\$)
。
import re
text = "$FOO FOO $BAR BAR"
print(re.findall(r"\b(?<!\$)\w+", text))
# > ['FOO', 'BAR']
现在,正如您所说(?<=^)(?!\$)\w+|(?<=\s)(?!\$)\w+
的对您有用,您现在可以看到您可以安全地从正则表达式中删除前瞻,因为它们没有做任何有意义的事情,并且正则表达式变为(?<=^)\w+|(?<=\s)\w+
. 这个表达式可以进一步缩小为一个苗条的(?<!\S)\w+
模式,它匹配任何一个或多个紧接在字符串开头或空格之前的单词字符。
推荐阅读
- algorithm - 寻找一种“反向哈希”算法,该算法可以从一个小种子中产生一组很长的字符
- python-3.x - 如何使用python生成带有表情符号的随机图像
- php - 难以理解 CI4 布局或一般布局
- javascript - 有没有办法让 javascript 图表显示在 plotly dash 中?
- ice - 有什么方法可以为 ZerocIce 的 IceGrid 服务器指定节点端口/端口范围?
- python - 使用 Python 字典计算单词的频率,不包括将从第二个文件中读取的一组“停用词”
- tekton - 除非以 root 身份运行,否则 Tekton 管道无法在工作区目录中创建文件
- node.js - HTTPS Post via Axios 抛出错误客户端网络套接字已断开/EPROTO
- python-3.8 - 在python中查找字符串中的单词
- google-cloud-platform - 当最大实例限制设置为高于 0 时,Google Cloud 函数的事件队列限制