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

Python正则替换问题:为何.lh、lh.等匹配项未被正确替换?

问题原因

  1. 键匹配不对应:你用d.get(m.group(0))查找字典值,但字典的键是lh,而正则匹配到的.lh、lh.这类字符串不在字典中,返回None,re.sub会将None视为空字符串,导致这些匹配项被直接删除。
  2. 分组未被利用:正则表达式将前后点号和核心键分成了不同分组,但替换逻辑没有提取核心键,反而直接使用整个匹配字符串去查字典。

解决办法

调整替换逻辑,从匹配结果中提取核心键文本(忽略前后的点号),再去字典中取值替换整个匹配项;同时简化正则表达式的边界判断:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:40:32