正则表达式匹配自然数:为何结果包含空格与无关字符?
正则匹配自然数时出现多余字符的原因及解决方法
你编写的正则表达式用于匹配无前缀+/-的自然数,但结果中出现了空格、字母等多余字符,先看你的代码和输出:
你的代码
import re text = "lOngPa$$W0Rd 2342 +4324423 -4234234 fsdf 4 fdsfsr +45 frwr gfdg42f" match = re.findall(r'[^+-]\d+', text) print(match)
输出结果
['W0', ' 2342', '4324423', '4234234', ' 4', '45', 'g42']
原因分析
你的正则[^+-]\d+的逻辑是匹配一个非+/-的字符,再加上后面的连续数字,结果里的空格、字母(如W、g)都是[^+-]匹配到的内容:
W0:0前面的W不属于+/-,被[^+-]捕获后和0一起返回2342:2342前面的空格不属于+/-,被捕获后和数字组合g42:42前面的g不属于+/-,被捕获后和数字组合
另外,输出里的4324423、4234234属于错误匹配——它们前面是+和-,本不该被选中,但因为正则扫描时会跳过+/-,尝试匹配后续数字的前序非+/-字符(实际不存在),属于正则逻辑漏洞导致的误匹配。
解决方法
要实现“匹配无前缀+/-的自然数,且不捕获前面的多余字符”,应该用负向零宽后行断言(?<!\+|-),它只会检查数字序列的前面不是+或-,不会捕获任何无关字符。
修正后的代码:
import re text = "lOngPa$$W0Rd 2342 +4324423 -4234234 fsdf 4 fdsfsr +45 frwr gfdg42f" match = re.findall(r'(?<!\+|-)\d+', text) print(match)
预期输出
['0', '2342', '4', '42']
这样只会捕获符合条件的数字序列,不会包含空格、字母等多余字符,同时也不会匹配+/-后面的数字。
内容的提问来源于stack exchange,提问作者CollonelDain
相关产品推荐
相关产品推荐

