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

如何在re.sub()中分割捕获组'\2'以替换空格为下划线?

解决re.sub中捕获组内容的空格替换问题

嘿,这个问题我之前也踩过坑!你现在的写法行不通,是因为当你定义p2的时候,r'\2'只是一个字面量字符串,split(' ')分割的是这个字符串本身(也就是['\\2']),join之后还是'\2',所以替换的时候根本没对捕获到的实际内容做空格替换。

要实现预期的效果,你需要用到re.sub()的回调函数功能——让re.sub每次找到匹配项时,调用一个函数来动态处理捕获到的内容,而不是用静态字符串作为替换值。

具体解决方案

方法1:使用自定义函数

import re

InputString = r'On <ENAMEX TYPE="DATE">August 17</ENAMEX> , <ENAMEX TYPE="GPE">Tai wan</ENAMEX> is investigation department.'
p1 = r'<ENAMEX TYPE="(\S+)">(.+?)</ENAMEX>'

def process_match(match_obj):
    # 获取第二个捕获组的内容(就是我们要替换空格的文本)
    target_text = match_obj.group(2)
    # 把空格替换成下划线后返回
    return target_text.replace(' ', '_')

plain_text = re.sub(p1, process_match, InputString)
print(plain_text)

方法2:用Lambda简化写法

如果逻辑简单,直接用lambda表达式更简洁:

import re

InputString = r'On <ENAMEX TYPE="DATE">August 17</ENAMEX> , <ENAMEX TYPE="GPE">Tai wan</ENAMEX> is investigation department.'
p1 = r'<ENAMEX TYPE="(\S+)">(.+?)</ENAMEX>'

plain_text = re.sub(p1, lambda m: m.group(2).replace(' ', '_'), InputString)
print(plain_text)

运行结果

两种方法都会输出你想要的结果:

On August_17 , Tai_wan is investigation department.

原理说明

当re.sub()的第二个参数是函数时,每次匹配到符合正则的内容,就会把一个匹配对象传给这个函数。你可以通过匹配对象的group()方法获取各个捕获组的实际内容,然后对这些内容做任意处理(比如替换空格),最后返回处理后的字符串作为替换值。

内容的提问来源于stack exchange,提问作者futurelj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:44:47