为什么我的带有单词边界的正则表达式会失败?

Why does my regex with word boundary fail?

我想匹配数字,正数或负数,可能前面有货币符号。但我不想要像 PSM-9 这样的东西。我的代码是:

test='AAA PCSK-9, 1 -3,33'
re.findall(r'\b-?[$€£]?-?\d+[\d,.]*\b', test)

输出为:['-9', '111', '3,33'] 有人可以解释为什么匹配 -9 吗?提前谢谢你。

编辑: 我没有匹配 PCSK-9 的任何部分,它就像产品名称而不是数字。所以我想要的输出是:

['111', '3,33']

这是因为\b匹配了K-之间的空隙,一个单词和一个非单词字符。如果你想避免匹配 - 如果它前面有一个词,你可以使用否定的 lookbehind 来代替:

re.findall(r'[$€£]?(?:(?<!\w)-)?\d+[\d,.]*\b', test)

根据您的样本输入,这个 returns:

['9', '111', '3,33']

演示:https://regex101.com/r/A66C5W/1

word boundary 匹配 K 和破折号。由于问号,破折号 [$€£]?-? 之后的 2 个部分是可选的,然后您可以匹配一个或多个数字。这导致匹配 -9

您可能会使用一个断言来代替单词边界,该断言使用负向后视和负向前视检查匹配前后的内容是否不是非空白字符\S

(?<!\S)-?[$€£]?(\d+(?:[,.]\d+)?)(?!\S)

Regex demo | Python demo

-9 是匹配的,因为 - 是一个非单词字符,而 S 是一个单词字符...所以在它们之间有一个单词间边界 \b ,正如您在正则表达式中所述。