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

如何用Python的re.sub结合字典替换每行首个匹配子串?

实现每行首个匹配子串的精确替换(Python re.sub)

原有实现(批量替换所有匹配项)

之前已实现用re.sub结合字典批量替换所有精确匹配的子串,代码如下:

import re

words = " apple pineapple cat category data old_data"
dic = {"apple":"apple_new", "cat":"cat_new", "data":"data_new"}

# 构建带单词边界、转义特殊字符的精确匹配正则
pattern = r'\b(' + r'|'.join([re.escape(x) for x in list(dic.keys())]) + r')\b'
new_words = re.sub(pattern, lambda m: dic[m.group(0)], words)

print(new_words)

需求变更:仅替换每行首个匹配项

现在需要修改为仅替换每行中的第一个匹配子串,同时完整保留原始空格、换行符:

  • 原始字符串:
words = " apple cat data old_data\n     pineapple category data old_data\n   data old_data"
  • 期望结果:
words = " apple_new cat data old_data\n     pineapple category data old_data\n   data_new old_data"

解决方案

全局正则替换无法直接实现“每行仅替换第一个”的逻辑,最直观可靠的方式是按行遍历处理,对每行单独执行单次替换,再拼接回完整字符串。代码如下:

import re

words = " apple cat data old_data\n     pineapple category data old_data\n   data old_data"
dic = {"apple":"apple_new", "cat":"cat_new", "data":"data_new"}

# 预编译精确匹配的正则模式
pattern = re.compile(r'\b(' + r'|'.join([re.escape(x) for x in dic.keys()]) + r')\b')

# 按行拆分后逐个处理:每行仅替换第一个匹配项
lines = words.split('\n')
processed_lines = [pattern.sub(lambda m: dic[m.group(0)], line, count=1) for line in lines]

# 拼接回带原始格式的完整字符串
new_words = '\n'.join(processed_lines)

print(new_words)

代码说明

  1. 按行拆分:用split('\n')将原始字符串拆分为独立行,避免跨行匹配干扰。
  2. 单次替换:re.sub的count=1参数限定仅替换每行的第一个匹配项。
  3. 格式保留:拆分和拼接均使用换行符\n,完全保留原始的空格、换行等排版格式。

内容的提问来源于stack exchange,提问作者胡峻誠

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:50:23