用于匹配和替换模式中字符的正则表达式

Regex to match and replace a character in a pattern

我想用 "fi" 替换字符串中的字符 "?"

我可以为此编写一个通用的 str 替换。但是我想替换“?”仅当它出现在两个 A-Za-z 字符之间并避免其余

例如,"Okay?" 应该是 "Okay?" 而不是 "Okayfi"

但是

Modi?es 应该是 Modifies 因为它有 ?在中间

我尝试了什么?

sentence = re.sub(r"(\?)\b", "fi", sentence)

请看这里。 https://regexr.com/3nvk3

似乎在正则表达式中工作正常。但在代码中效果不佳。我做错了什么吗?

这里最好的方法是找到带 ligature的原文,然后用适当的编码读入。

否则,您将不得不使用一些变通方法。

您可以使用 (?<=[a-zA-Z]) / (?=[A-Za-z]) 环视:

sentence = re.sub(r"(?<=[a-zA-Z])\?(?=[a-zA-Z])", "fi", sentence)

regex demo(?<=[a-zA-Z]) 正后向匹配紧接 ASCII 字母之后的位置,(?!=[A-Za-z]) 正向后向匹配紧接 ASCII 字母之前的位置。

或者,您也可以使用带反向引用的捕获组:

sentence = re.sub(r"([a-zA-Z])\?([a-zA-Z])", r"fi", sentence)

参见 another regex demo。请注意,</code> 引用第一个 <code>([a-zA-Z]) 组捕获的值,</code> 引用第 2 组(<code>([a-zA-Z]))捕获的值。