Python正则匹配人名后循环置空元素异常问题排查
问题排查与修正
需求
提取首字母大写的单词,当且仅当该单词位于句首或指定前缀((?:,and|and|her friends|,or |or |,))之后。
原始代码
import re match_names = "" input_sense = "Susan gave some cosmetic gifts to her friends Lisa, Veronica and Katy, but only Katy thanked her" # 拼接一个不太会被用到的字符串,用于匹配句首的情况 input_sense = "rlt99ll" + input_sense if match := re.findall(r"(?:rlt99ll|,and|and|her friends|,or |or |,)\s*([A-Z].*?\b)", input_sense): match_names = match print("match names: ") print(match_names) input_sense = input_sense.replace("rlt99ll", "") # 仅为匹配模式添加的辅助字符串,用完移除 n = 0 print("match_auxs : ") for name in match_names: match_aux = match_names for m in match_aux: if (m == name): match_aux[n] = "" n += 1 n = 0 print(match_aux)
期望输出
match names: ['Susan', 'Lisa', 'Veronica', 'Katy'] match_auxs : ['','Lisa', 'Veronica', 'Katy'] ['Susan', '', 'Veronica', 'Katy'] ['Susan', 'Lisa', '', 'Katy'] ['Susan', 'Lisa', 'Veronica', '']
实际错误输出
match names: ['Susan', 'Lisa', 'Veronica', 'Katy'] match_auxs : ['', 'Lisa', 'Veronica', 'Katy'] ['', '', 'Veronica', 'Katy'] ['', '', '', 'Katy'] ['', '', '', '']
问题原因
- 列表引用赋值导致原列表被修改:
match_aux = match_names不是创建新列表,而是让match_aux指向原列表match_names的内存地址,每次修改match_aux都会直接改变原列表内容,导致后续循环的初始列表已经是被修改过的状态。 - 遍历匹配值的逻辑有误:通过值匹配
m == name来置空元素,不仅会累计修改,还可能在存在重复元素时错误置空多个位置。
修正后的代码
import re match_names = [] input_sense = "Susan gave some cosmetic gifts to her friends Lisa, Veronica and Katy, but only Katy thanked her" # 拼接辅助字符串匹配句首 input_sense = "rlt99ll" + input_sense if match := re.findall(r"(?:rlt99ll|,and|and|her friends|,or |or |,)\s*([A-Z].*?\b)", input_sense): match_names = match print("match names: ") print(match_names) input_sense = input_sense.replace("rlt99ll", "") print("match_auxs : ") # 遍历索引和元素,针对每个位置单独置空 for idx in range(len(match_names)): # 创建原列表的副本,避免修改原列表 match_aux = match_names.copy() match_aux[idx] = "" print(match_aux)
修正说明
- 创建列表副本:使用
match_names.copy()(或list(match_names))创建新的列表副本,确保每次循环的初始列表都是原始的匹配结果,不会被之前的修改影响。 - 通过索引定位置空:直接利用索引定位需要置空的元素,逻辑更简洁,同时避免重复元素带来的错误匹配问题。
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

