You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用re.sub对嵌套列表执行多模式替换?

问题描述

我有一个嵌套列表old_list:

[['hi.','pt','patient','med',...],
['.','md','pt','md',...]...]

期望得到新列表new_list:

[['hi',' ',' ','medication',...],
[' ', 'medication', ' ',...]...]

尝试了以下三种方法但均未生效,输出与原old_list一致:

  • 方法1:用字典存储替换规则,循环调用re.sub
adict = {"\.": " ",
        "patient": " ",
        "\bpt\b": " ",
        "\bmed\b":"medication"}

for key, value in adict.items():
    new_list= [[re.sub(key, value, e) for e in d] for d in old_list]
  • 方法2:用元组列表存储替换规则,循环处理
replacements = [('\.', ""),
                ("patient"," "),
                ("\bpt\b", " "),
                ("\bmed\b","medication")]

for old, new in replacements:
    new_list=[]
    new_list= [[re.sub(old, new, e) for e in d] for d in old_list]
  • 方法3:使用replace(new_list, old, new) for ...形式处理
问题原因与解决建议

核心问题分析

  1. 正则转义错误:普通字符串中的\b会被Python解析为退格符,而非正则表达式的单词边界;\.未用原始字符串时也会出现解析偏差,导致正则匹配失效。
  2. 循环覆盖结果:方法1、2中每次循环都会重新生成new_list,覆盖之前的替换结果,最终仅保留最后一次替换的效果。
  3. str.replace局限性:该方法仅支持精确字符串匹配,无法处理\b这类正则规则,因此完全无效。

修正后的实现方案

方案1:分步循环替换(清晰易维护)

import re

# 示例原始列表
old_list = [['hi.', 'pt', 'patient', 'med'], ['.', 'md', 'pt', 'md']]

# 用原始字符串定义替换规则,注意顺序:先匹配长字符串,避免短规则干扰长匹配
replacements = [
    (r'patient', ' '),
    (r'\bpt\b', ' '),
    (r'\bmed\b', 'medication'),
    (r'\.', '')  # 先把点号去掉,后续统一处理空字符串转空格
]

# 初始化新列表为原列表的副本,避免修改原始数据
new_list = [row.copy() for row in old_list]

# 循环执行所有替换,在已有结果上累计更新
for pattern, repl in replacements:
    for idx, row in enumerate(new_list):
        new_list[idx] = [re.sub(pattern, repl, item) for item in row]

# 把替换后产生的空字符串转为空格
for idx, row in enumerate(new_list):
    new_list[idx] = [' ' if item == '' else item for item in row]

print(new_list)

方案2:单函数封装替换(简洁高效)

import re

old_list = [['hi.', 'pt', 'patient', 'med'], ['.', 'md', 'pt', 'md']]

def process_item(item):
    # 按顺序执行替换
    item = re.sub(r'patient', ' ', item)
    item = re.sub(r'\bpt\b', ' ', item)
    item = re.sub(r'\bmed\b', 'medication', item)
    item = re.sub(r'\.', '', item)
    # 处理空字符串
    return ' ' if item == '' else item

new_list = [[process_item(item) for item in row] for row in old_list]
print(new_list)

输出结果

两种方案均会得到符合预期的结果:

[['hi', ' ', ' ', 'medication'], [' ', 'md', ' ', 'md']]

内容的提问来源于stack exchange,提问作者FloriaT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:40:41