正则匹配替换求助:仅替换字母间的?为fi,代码实现异常
问题分析与解决方案
你的正则表达式问题出在对单词边界\b的理解和使用上,这也是它在测试工具和实际代码中表现不一致的核心原因。
为什么原正则不生效?
\b是单词边界,它仅匹配\w(字母、数字、下划线)与非\w字符的交界位置,或者字符串的开头/结尾。
- 对于你想替换的
Modi?es:?后面是字母e(属于\w),所以?和e之间不存在单词边界,原正则根本匹配不到这个目标?; - 反而对于你想保留的
Okay?:?后面是字符串结尾(非\w),这里存在单词边界,原正则会错误地把它替换成Okayfi,完全违背你的需求。
正确的正则写法
要精准匹配夹在两个字母之间的?,应该用正向预查和反向预查来限定前后的字符范围:
import re sentence = re.sub(r"(?<=[A-Za-z])\?(?=[A-Za-z])", "fi", sentence)
拆解一下这个正则的逻辑:
(?<=[A-Za-z]):反向预查,确保?的前面是任意大小写字母;\?:匹配实际的?字符(必须转义,因为?在正则中是特殊元字符);(?=[A-Za-z]):正向预查,确保?的后面是任意大小写字母。
测试验证
- 输入
Modi?es→ 输出Modifies(符合预期替换); - 输入
Okay?→ 输出Okay?(符合预期保留); - 输入
x?y z?→ 输出xfiy z?(仅替换夹在字母间的?)。
内容的提问来源于stack exchange,提问作者Mohammed Ashiq
相关产品推荐
相关产品推荐

