Python中Regex匹配数组元素失效问题求助
问题排查与解决
嘿,我来帮你梳理下你忽略的两个关键问题:
re.match()的匹配范围限制:
Python里的re.match()方法只会从字符串的起始位置开始尝试匹配,而你的数组元素开头是\n(换行符加空格),正则表达式从开头找数字自然匹配失败。而Notepad++的正则匹配默认是在整个文本中查找匹配项,相当于Python里的re.search()或者findall()的行为。正则表达式中的
.未转义:
你写的\d.\d\d\d里的.是正则的通配符,会匹配任意单个字符(比如字母、符号都可以),而你实际要匹配的是小数点,必须转义成\.,否则会出现不符合预期的匹配结果。
修正后的代码方案
方案1:改用re.search()(推荐,更灵活)
这个方法会在整个字符串范围内查找匹配的内容,不需要考虑字符串开头的空白:
import re array1 = ['\n 1.979 \n, \n 1.799 \n'] # 转义小数点,同时用\d{3}替代\d\d\d让正则更简洁 regex = re.compile(r'\d\.\d{3}') filteredarray = [i for i in array1 if regex.search(i)] print(filteredarray) # 输出: ['\n 1.979 \n, \n 1.799 \n']
方案2:调整正则适配re.match()
如果坚持要用match(),可以在正则开头加上匹配任意空白字符的\s*(*表示0个或多个),这样就能跳过开头的换行和空格:
import re array1 = ['\n 1.979 \n, \n 1.799 \n'] regex = re.compile(r'\s*\d\.\d{3}') filteredarray = [i for i in array1 if regex.match(i)] print(filteredarray) # 输出: ['\n 1.979 \n, \n 1.799 \n']
额外:提取具体数字
如果你想从字符串中提取出所有符合格式的数字(而不是保留整个原字符串),可以用findall():
import re array1 = ['\n 1.979 \n, \n 1.799 \n'] regex = re.compile(r'\d\.\d{3}') extracted_numbers = [num for item in array1 for num in regex.findall(item)] print(extracted_numbers) # 输出: ['1.979', '1.799']
内容的提问来源于stack exchange,提问作者J L
相关产品推荐
相关产品推荐

