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

时间:2018-10-01 01:50:25

标签: 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']

3 个答案:

答案 0 :(得分:1)

这是因为\b匹配K-之间的空格,即单词和非单词字符。如果您想避免在-前面加上一个单词,则可以改用负向后查找:

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

使用示例输入,将返回:

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

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

答案 1 :(得分:0)

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

您可能会使用一个断言来检查匹配前后的内容是否为非空白字符\S(使用负向后查找和负向前查找)。

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

Regex demo | Python demo

答案 2 :(得分:0)

-9之所以匹配是因为-是一个非单词字符,而S是一个单词字符...因此,在单词间边界\b之间,您在正则表达式中声明。