Python正则替换问题:为何.lh、lh.等匹配项未被正确替换?
问题原因
- 键匹配不对应:你用
d.get(m.group(0))查找字典值,但字典的键是lh,而正则匹配到的.lh、lh.这类字符串不在字典中,返回None,re.sub会将None视为空字符串,导致这些匹配项被直接删除。 - 分组未被利用:正则表达式将前后点号和核心键分成了不同分组,但替换逻辑没有提取核心键,反而直接使用整个匹配字符串去查字典。
解决办法
调整替换逻辑,从匹配结果中提取核心键文本(忽略前后的点号),再去字典中取值替换整个匹配项;同时简化正则表达式的边界判断:
import re d = {"lh": "left hand"} sentence = "lh l.h. lh. -lh- l.h .lh plh phli lhp 1lh lh1" # 正则:匹配非单词/数字开头,可选点号 + 核心键 + 可选点号 + 非单词/数字结尾 pattern_replace = r'(?<![a-zA-Z0-9])(\.?)(' + '|'.join(sorted(re.escape(k) for k in d)) + r')(\.?)(?![a-zA-Z0-9])' # 替换时提取核心键(第2组),转小写后取字典值(配合IGNORECASE实现大小写不敏感) sentence = re.sub(pattern_replace, lambda m: d.get(m.group(2).lower()), sentence, flags=re.IGNORECASE) print(sentence)
输出结果
left hand l.h. left hand -left hand- l.h left hand plh phli lhp 1lh lh1
说明
- 正则中
(?<![a-zA-Z0-9])和(?![a-zA-Z0-9])确保匹配独立的目标(避免和plh、lh1这类包含lh的单词/数字组合误匹配)。 - 分组
(\.?)匹配前后可选的点号,核心键被捕获到第2组m.group(2),提取后转小写(配合re.IGNORECASE),再从字典中获取对应值替换整个匹配项。
内容的提问来源于stack exchange,提问作者Parsh
相关产品推荐
相关产品推荐

