You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动