我想匹配数字,可以是正数,也可以是负数,可能前面要有货币符号。但是我不想要像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']
答案 0 :(得分:1)
这是因为\b
匹配K
和-
之间的空格,即单词和非单词字符。如果您想避免在-
前面加上一个单词,则可以改用负向后查找:
re.findall(r'[$€£]?(?:(?<!\w)-)?\d+[\d,.]*\b', test)
使用示例输入,将返回:
['9', '111', '3,33']
答案 1 :(得分:0)
word boundary在K和破折号之间匹配。破折号[$€£]?-?
后的2个部分是可选的,因为有问号,然后您将一个或多个数字匹配。这将导致匹配-9
您可能会使用一个断言来检查匹配前后的内容是否为非空白字符\S
(使用负向后查找和负向前查找)。
(?<!\S)-?[$€£]?(\d+(?:[,.]\d+)?)(?!\S)
答案 2 :(得分:0)
-9
之所以匹配是因为-
是一个非单词字符,而S
是一个单词字符...因此,在单词间边界\b
之间,您在正则表达式中声明。