如何用Python批量给指定短语加冒号且避免重复添加
实现方案
首先分析原有代码的两个核心问题:
- 每次替换都基于原始文本
present_text,没有保存上一次的修改结果,最终只能生效最后一次匹配的替换操作 - 没有判断目标短语末尾是否已经存在冒号,容易出现重复添加的问题
推荐实现(正则表达式方案)
用正则匹配目标短语,且匹配时排除短语后已经跟了冒号的情况,同时累计修改结果:
import re present_text="REASON FOR VISIT Referred by. Elevated PSA. HISTORY OF PRESENT ILLNESS JAMES EVERING is an 81 year old male. CURRENT MEDICATION AmLODIPine Besylate 5 MG Tablet 90 days, 0 refills PREVIOUS THERAPY: History of education and instructions" target_phrases = ["HISTORY OF PRESENT ILLNESS","CURRENT MEDICATION","ENCOUNTER NOTES","PREVIOUS THERAPY"] # 按短语长度从长到短排序,避免短短语先匹配覆盖长短语的情况 target_phrases_sorted = sorted(target_phrases, key=lambda x: len(x), reverse=True) result = present_text for phrase in target_phrases_sorted: # 正则含义:匹配完整短语,且短语后面没有紧跟冒号 pattern = re.compile(re.escape(phrase) + r'(?!:)') result = pattern.sub(phrase + ':', result) print(result)
输出验证
运行后输出和预期完全一致:
REASON FOR VISIT Referred by. Elevated PSA. HISTORY OF PRESENT ILLNESS: JAMES EVERING is an 81 year old male. CURRENT MEDICATION: AmLODIPine Besylate 5 MG Tablet 90 days, 0 refills PREVIOUS THERAPY: History of education and instructions
逻辑说明
- 提前对目标短语按长度倒序排序,避免存在包含关系的短语(比如同时有A和AB)时,短短语先匹配导致长短语无法正常识别
- 正则用
re.escape()处理短语,避免短语里存在正则特殊字符时匹配出错 - 负向先行断言
(?!:)保证只有短语后面没跟冒号的时候才会替换,不会重复加冒号 - 所有修改都基于上一次处理后的
result变量,替换结果可以累计
内容的提问来源于stack exchange,提问作者user17142920
相关产品推荐
相关产品推荐

