Python正则表达式替换问题:如何用选中文本内的单词替换原内容?
嘿,我明白你遇到的问题了——想用re.sub把文本里的<ERR targ=xxx> yyy </ERR>块替换成targ属性里的正确单词,但替换内容没按预期生效对吧?这大概率是因为你没正确使用正则的反向引用,或者没处理好字符串转义的问题。下面给你两种靠谱的解决办法:
方法1:用反向引用字符串直接替换
先写对能捕获targ值的正则,然后在替换时用反向引用调用捕获到的内容就行,注意要给替换字符串加r前缀(原始字符串),不然\1会被当成普通转义字符处理:
import re # 你的目标文本 target_text = "I go to Bridgebrook i go out <ERR targ=sometimes> some times </ERR> on Tuesday night i go to Youth <ERR targ=club> clob </ERR> ." # 正则匹配ERR块,捕获targ后的正确单词 err_pattern = r'<ERR targ=(\w+)>.*?</ERR>' # 用\1引用第一个捕获组的内容,注意替换字符串要加r前缀 fixed_text = re.sub(err_pattern, r'\1', target_text) print(fixed_text)
运行后会输出你想要的结果:
I go to Bridgebrook i go out sometimes on Tuesday night i go to Youth club .
这里的.*?是非贪婪匹配,能确保只匹配到最近的</ERR>,不会把多个ERR块当成一个整体匹配。
方法2:用自定义函数做灵活替换
如果之后你需要对捕获到的单词做额外处理(比如转大写、拼写校验),可以把re.sub的第二个参数换成函数,函数接收匹配对象,你可以从中提取需要的内容:
import re target_text = "I go to Bridgebrook i go out <ERR targ=sometimes> some times </ERR> on Tuesday night i go to Youth <ERR targ=club> clob </ERR> ." def replace_err_block(match_obj): # 从匹配对象里取出第一个捕获组的内容(也就是targ里的正确单词) return match_obj.group(1) err_pattern = r'<ERR targ=(\w+)>.*?</ERR>' fixed_text = re.sub(err_pattern, replace_err_block, target_text) print(fixed_text)
这个方法扩展性更强,比如你想把替换后的单词转成大写,只需要把return match_obj.group(1)改成return match_obj.group(1).upper()就行。
小提醒
如果你的targ值可能包含字母数字以外的字符(比如连字符、下划线),可以把正则里的\w+换成[^>]+,这样能匹配到targ=到>之间的所有内容,适配更多场景。
内容的提问来源于stack exchange,提问作者Hazem Alabiad




