Python正则匹配子串替换的更优雅实现方案咨询
优化Python中替换【】内空格的优雅写法
需求说明
匹配句子中被【】包裹的内容,仅将包裹内容内部的空格替换为“-”:
- 输入示例:
(c)variable < var_CONST1(例 -125(N)) 【AAA BBB有】AND【技術企画】AND【AAA BBB CCC】 - 预期输出:
(c)variable < var_CONST1(例 -125(N)) 【AAA-BBB有】AND【技術企画】AND【AAA-BBB-CCC】
原实现代码
import re text = "(c)variable < var_CONST1(例 -125(N)) 【AAA BBB有】AND【技術企画】AND 【AAA BBB CCC】" match_list = re.findall(r"【[\w\s]+】", text) match_list = [w.replace(" ", "-") for w in match_list] tmp_txt = re.sub(r"【[\w\s]+】", " tkn ", text).split() new_txt = "" for txt in tmp_txt: if txt == "tkn": new_txt = new_txt + " " + match_list[0] match_list.pop(0) else: new_txt = new_txt + " " + txt print(new_txt)
更优雅的实现方式
利用re.sub的回调函数特性,直接对每个匹配到的内容做处理,无需拆分文本和维护匹配列表:
import re text = "(c)variable < var_CONST1(例 -125(N)) 【AAA BBB有】AND【技術企画】AND 【AAA BBB CCC】" def replace_inner_space(match): # 获取完整的匹配内容(包含【】) matched_content = match.group(0) # 替换内容内部的空格为“-” return matched_content.replace(" ", "-") # 用【[^】]+】匹配所有【】包裹的内容(兼容任意非】的字符) result = re.sub(r"【[^】]+】", replace_inner_space, text) print(result)
优化点说明
- 简化流程:通过回调函数直接处理每个匹配项,省去了拆分文本、维护替换列表的步骤,逻辑更紧凑
- 正则兼容性提升:原正则
【[\w\s]+】仅能匹配字母、数字、下划线和空格,新正则【[^】]+】可以匹配【】内的任意字符(除了】本身),适用场景更广 - 减少中间变量:无需临时存储匹配结果和拆分后的文本,内存占用更低
内容的提问来源于stack exchange,提问作者shane.singwa
相关产品推荐
相关产品推荐

