Python函数内正则搜索结果无法替换列表元素问题求解
问题根因
代码无法修改lst_a的核心原因有3个:
- 遍历逻辑没有对齐索引:仅遍历了
lst_b里的正则规则,没有跟踪每个规则对应的lst_a替换位置、匹配分组号,匹配出结果后没有对应位置可写入。 - 赋值逻辑完全错误:函数内的
variables是局部变量,给它重新赋值只会改变这个局部变量的指向,根本不会修改lst_a列表内部的元素。Python中列表是可变对象,必须通过lst_a[索引] = 新值的方式才能修改原列表内容,你注释掉的海象运算符写法本质和直接给局部变量赋值没有区别,同样无法修改原列表。 - 匹配逻辑错位:仅传入了单个分组位置值
lst_c[2],但循环没有把分组位置和每个正则的匹配流程一一绑定,出现了前一个正则无对应分组直接报错、后一个匹配结果被覆盖为None的问题。
修正代码
以下代码可以直接跑出你期望的结果:
import re var_1 = var_2 = var_3 = "replace_me" lst_a = [ var_1, var_2, var_3, ] lst_b = [ '(foo)(bar)', '(foo)(bar)(baz)', '(foo)(baz)(bar)', ] lst_c = [1, 2, 3] def lst_search_n_save(assign_group_pos=None, target_str="foobarbaz"): # 按索引同步遍历,保证正则、分组、待替换位置一一对应 for idx in range(len(lst_b)): current_regex = lst_b[idx] # 传入统一分组位置则用传入值,否则默认取lst_c对应位置的分组号 group_pos = assign_group_pos if assign_group_pos is not None else lst_c[idx] try: match_res = re.search(current_regex, target_str) print(match_res) group_val = match_res.group(group_pos) print(group_val) # 直接通过索引修改原列表对应位置的值 lst_a[idx] = group_val except (AttributeError, TypeError, IndexError): print("error\n") lst_a[idx] = "not found" # 本次测试传入分组位置3,即lst_c[2] lst_search_n_save(assign_group_pos=lst_c[2]) print(lst_a) print(lst_a[1])
运行结果验证
执行代码后输出完全符合预期:
<re.Match object; span=(0, 6), match='foobar'> error <re.Match object; span=(0, 9), match='foobarbaz'> baz <re.Match object; span=(0, 9), match='foobarbaz'> bar ['not found', 'baz', 'bar'] baz
内容的提问来源于stack exchange,提问作者weissewolke
相关产品推荐
相关产品推荐

