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

Python 为什么我的带有单词边界的正则表达式失败了?,python,regex,word-boundary,Python,Regex,Word Boundary,我想把数字,正数或负数,可能和前面的货币符号匹配。但我不想要像PSM-9这样的东西。我的代码是: test='AAA PCSK-9, $111 -3,33' re.findall(r'\b-?[$€£]?-?\d+[\d,.]*\b', test) 输出为:['-9','111','3,33'] 有人能解释为什么-9匹配吗?先谢谢你 编辑: 我不知道PCSK-9的任何部分是匹配的,它就像一个产品的名称,而不是一个数字。因此,我期望的输出是: ['111', '3,33'] 这是因为\b匹配K

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

test='AAA PCSK-9, $111 -3,33'
re.findall(r'\b-?[$€£]?-?\d+[\d,.]*\b', test)
输出为:
['-9','111','3,33']
有人能解释为什么-9匹配吗?先谢谢你

编辑: 我不知道PCSK-9的任何部分是匹配的,它就像一个产品的名称,而不是一个数字。因此,我期望的输出是:

['111', '3,33']

这是因为
\b
匹配
K
-
之间的间隙,即单词和非单词字符。如果要避免匹配
-
,如果前面有一个单词,则可以使用负查找:

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

K和破折号之间的匹配。由于问号的原因,破折号后面的两个部分是可选的,然后一个数字匹配一次或多次。这将导致匹配
-9

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


|

-9
是匹配的,因为
-
是一个非单词字符,
S
是一个单词字符……因此,正如您在regexp中所述,在这两者之间有一个单词间边界
\b

您能添加您的预期输出吗?我的预期输出是
['111',3,33']
。基本上,我想数数数字,但PSK-9不是我想要的,因为它更像是一个产品的名称。谢谢你,布莱辛。我忘了输入我的预期输出,
['111',3,33']
。基本上,我想数一数数字,但PSK-9不是我想要的,因为它更像是宝马X5等产品的名称。谢谢你,第四只鸟,
\s
完美地解决了我的问题。
['9', '111', '3,33']