Python中Regex Sub分组匹配:替换特定双引号的技术问题咨询
解决Python Regex Sub替换内部双引号为单引号的问题
嘿,我明白你遇到的问题了——咱们一步步拆解,把这个替换功能搞定。
首先,你得到i$1'$2这种奇怪输出的根本原因:你在替换字符串里用了Perl风格的分组引用($1、$2),但Python的re.sub()是用反斜杠(\1、\2)来引用分组的。所以那些$1会被当作普通文本直接输出,而不是插入你捕获的内容。
现在回到你的核心需求:把夹在单词字符中间的双引号(比如"it"s"里的中间引号)替换成单引号,同时保留外层的双引号。
方案一:使用环视断言(最简洁的方式)
环视断言特别适合这种场景——它能匹配目标引号,但不会捕获周围的字符,所以你的替换内容只需要一个单引号就行。
正则表达式(?<=\w)"(?=\w)会匹配紧接在单词字符(\w代表字母、数字、下划线)之后、且紧随另一个单词字符之前的双引号。用法如下:
import re original_str = '"it"s"' # 在Python中实际要写成'"it\"s"'来转义内部引号 fixed_str = re.sub(r'(?<=\w)"(?=\w)', "'", original_str) print(fixed_str) # 输出:"it's"
方案二:使用捕获分组(如果你偏好显式捕获)
如果你想用捕获分组的方式,记得在替换字符串里用\1和\2来引用分组。这个模式会捕获引号前后的字符,然后把它们和中间的单引号重新拼接起来:
import re original_str = '"it"s"' fixed_str = re.sub(r'(\w)"(\w)', r'\1\'\2', original_str) print(fixed_str) # 输出:"it's"
处理更广泛的场景
如果你需要替换任何非首尾位置的双引号(不局限于单词字符之间),可以把环视断言改成匹配任意字符:(?<=.)"(?=.)。不过要注意,这个模式会替换像he said "hello"里的引号(因为它们夹在空格和单词之间),如果这不是你想要的,还是用\w版本更稳妥。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

