Pandas regex=True替换部分单词问题:需实现整词翻译替换
解决Pandas中德语词汇整词替换的问题
当前你的Pandas代码在替换德语词汇时,因默认正则匹配会命中子串,导致翻译结果错误:
Schlauchanschluss被错误替换为hoseanschluss(匹配了子串Schlauch)Anschlussleitung被错误替换为adapter plateleitung(匹配了子串Anschluss)
要实现整词/整短语替换,需解决两个核心问题:确保长词汇优先匹配、用正则边界限定完整词汇的匹配范围。
修改后的代码
import pandas as pd import re # 读取输入文件 text = pd.read_csv("TranslationInput.csv", sep=';', keep_default_na=False) change = pd.read_csv("germanTranslation.csv", sep='\s*:\s*') # 为德语词汇构建适配的正则匹配模式 def build_regex_pattern(german_term): # 处理带空格的多词短语,匹配前后非单词字符或字符串首尾 if ' ' in german_term: return fr'(?:^|\W){re.escape(german_term)}(?:\W|$)' # 处理单个单词,使用单词边界确保整词匹配 else: return fr'\b{re.escape(german_term)}\b' # 按德语词汇长度降序排序,确保长词先被匹配,避免短词替换长词的子串 change = change.assign(term_length=change['german'].str.len()).sort_values('term_length', ascending=False).drop('term_length', axis=1) # 构建替换字典:键为正则模式,值为英文翻译 translation_dict = {build_regex_pattern(row['german']): row['english'] for _, row in change.iterrows()} # 自定义替换函数,保留原文本的分隔符格式 def translate_text(s): for pattern, replacement in translation_dict.items(): # 替换时保留原有的前后符号(如冒号、空格),只替换核心词汇 s = re.sub(pattern, lambda match: match.group(0).replace(match.group(0).strip(), replacement), s) return s # 执行翻译并赋值到目标列 text['english'] = text['inputcolumn'].apply(translate_text) print(text['english'])
代码关键说明
- 长词优先排序:
把Schlauchanschluss这类长词汇放在Schlauch前面处理,从根本避免短词汇提前替换长词中的子串。 - 正则边界适配:
- 单词汇用
\b(单词边界),确保只有独立的Schlauch才会被替换,不会命中Schlauchanschluss里的子串。 - 多词短语(如
Warnung vor Handverletzungen)用(?:^|\W)和(?:\W|$)限定范围,确保整个短语作为整体被匹配。
- 单词汇用
- 格式保留:
使用lambda替换函数,只替换匹配到的核心词汇,保留原文本中的冒号、空格等分隔符,保证输出格式和原文本一致。
最终输出结果
0 warning sign: hand injury warning 1 hose connection 2 connecting cable Name: english, dtype: object
内容的提问来源于stack exchange,提问作者svevis
相关产品推荐
相关产品推荐

