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

正则匹配替换求助:仅替换字母间的?为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:25:40