通八洲科技

使用 Pandas 正则替换文本中匹配 ID 的特定值为对应描述

日期:2025-12-29 00:00 / 作者:聖光之護

本文介绍如何利用 pandas 的 `str.replace()` 配合正则表达式,精准替换文本列中与外部映射表 id 完全匹配的单词(非子串),实现多处、多次、上下文安全的批量文本替换。

在实际数据处理中,常需将自由文本中出现的标识符(如编号、代码、代号)按映射关系替换成可读性更强的描述性内容。例如,将句子中独立出现的 "123" 替换为 "John",但不能把 "1234" 中的 "123" 误替换。原始代码中使用 .map() 是错误的——它仅对整字段值做一对一映射,而 Content_Text 是句子而非单个 ID,因此无法生效。

正确做法是:基于正则表达式进行子字符串级的全局查找与替换,同时确保只匹配完整单词(word boundary \b),避免部分匹配。以下是完整、健壮的实现方案:

import pandas as pd
import re

# 读取数据
df_articles = pd.read_excel('Articles.xlsx')
df_macros = pd.read_excel('macros.xlsx')

# 构建映射 Series:ID → Description(注意转为字符串以统一类型)
mapping_series = df_macros.astype({'ID': str}).set_index('ID')['Description']

# 构造正则模式:\b(123|345|678)\b → 匹配独立单词形式的 ID
pattern = r'\b(' + '|'.join(re.escape(str(id_val)) for id_val in mapping_series.index) + r')\b'

# 执行安全替换:对每个匹配项,用 mapping_series 查找对应描述
df_articles['Content_Text'] = df_articles['Content_Text'].str.replace(
    pattern,
    lambda m: mapping_series.get(m.group(0), m.group(0)),  # 若无映射则保留原值
    regex=True
)

# 保存结果
df_articles.to_excel('updated_Articles.xlsx', index=False)

关键要点说明:

⚠️ 注意事项:

该方法兼顾准确性、可读性与工程实用性,是处理“文本内符号化占位符替换”任务的标准 Pandas 实践。