如何在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
相关产品推荐
相关产品推荐

