如何在循环使用re.search()时保留多字符串的重复匹配结果?
问题说明
我需要在多个字符串中提取「数字+小写字母」的匹配项(比如2inch),但现有代码只返回最后一个匹配结果,无法得到所有符合要求的项。我的需求是从列表['1_abc-2inch-scatter', '1_abc-2inch-uniform', '2_abc-3inch-scatter', '2_abc-3inch-uniform']中提取出['2inch', '2inch', '3inch', '3inch']。
错误代码
import re names = ['1_abc-2inch-scatter', '1_abc-2inch-uniform', '2_abc-3inch-scatter', '2_abc-3inch-uniform'] sizes = [] for name in names: sizes = re.search('\d[A-Za-z]+', name).group() print(sizes)
问题原因
循环里每次用sizes = ...直接覆盖了列表变量,把它变成了单个字符串,最后自然只剩最后一次循环的匹配结果。另外原正则\d[A-Za-z]+会匹配大小写字母,和需求里的小写字母匹配范围不符。
修复后的代码
import re names = ['1_abc-2inch-scatter', '1_abc-2inch-uniform', '2_abc-3inch-scatter', '2_abc-3inch-uniform'] sizes = [] for name in names: # 精准匹配数字+小写字母的模式,同时判断匹配是否存在 match = re.search(r'\d[a-z]+', name) if match: sizes.append(match.group()) print(sizes)
输出结果
['2inch', '2inch', '3inch', '3inch']
补充说明
- 使用
append()方法向列表中添加元素,避免直接赋值覆盖原有列表 - 正则调整为
r'\d[a-z]+',精准匹配数字后跟小写字母的目标模式 - 增加
if match:判断,防止字符串中无匹配项时抛出AttributeError
内容的提问来源于stack exchange,提问作者CYU1
相关产品推荐
相关产品推荐

