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

2024-06-02 06:56:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把数字,正数或负数,可能前面有货币符号。但我不想要类似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']

Tags: 代码testre名称编辑产品货币符号
3条回答

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

您可以使用一个断言来代替单词边界,该断言使用负lookbehind和负lookahead检查匹配前后的内容是否不是非空格字符\S。你知道吗

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

Regex demo| Python demo

-9匹配,因为-是非单词字符,S是单词字符。。。所以在这两者之间有一个词间边界\b,正如您在regexp中所述。你知道吗

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

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

通过示例输入,将返回:

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

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

相关问题 更多 >