Python如何使用正则匹配指定字段并删除对应花括号块内容
正则删除文本指定花括号块实现方案
问题背景
需要编写正则代码匹配文本文件中的指定模式,定位到目标内容后将其从原文本中移除,已完成文件读取的基础代码编写:
# Reading the file data and store it with open('file.txt','r+') as f: file = f.read() print(file)
读取到的原始文本内容如下:
'{\n\tINFO\tDATA_NUMBER\t974\n\t{\n\t\tDAT_CQFD\n\t\t{\n\t\t\tsome random text \t787878\n\t\t}\n\t\tDATA_TO_MATCH\n\t\t{\n\t\t1\tbunch of characters \t985\n\t\t2\tbunch of data\t\t78\n\t\t}\n\t}\n\tINFO\tDATA_CATCHME\t123\n\t{\n\t\t3\tbunch of characters \n\t\t2\tbunch of datas\n\t}\n\tINFO\tDATA_INTACT\t\t456\n\t{\n\t\t3\tbunch of numbers \n\t\t2\tbunch of texts\n\t}\n\n'
具体需求
- 搜索匹配
DATA_TO_MATCH字段,定位到其所属块的闭合花括号},删除从该字段起始到对应闭合花括号(含花括号本身)的所有内容 - 对
DATA_CATCHME字段执行完全相同的删除操作
处理完成后的预期文本结果:
'{\n\tINFO\tDATA_NUMBER\t974\n\t{\n\t\tDATA_CQFD\n\t\t{\n\t\t\tsome random text \t787878\n\t\t}\n\n\t}\n\tINFO\tDATA_INTACT\t\t456\n\t{\n\t\t3\tbunch of numbers \n\t\t2\tbunch of texts\n\t}\n\n}\n'
已尝试的代码
目前已编写部分测试代码,但对正则语法和Python re模块使用不熟悉,无法写出符合要求的匹配模式,计划使用re.sub(my_patern,'', text)方法将匹配内容替换为空,实现删除效果:
import re #find the DATA_TO_MATCH re.findall(r".*DATA_TO_MATCH",file) #find the DATA_CATCHME re.findall(r".*DATA_CATCHME",file) #supposed to find everything before the closed bracket "}" re.findall(r"(?=.*})[^}]*",file)
实现代码
针对给出的文本结构(目标块无嵌套花括号),可以使用非贪婪匹配配合DOTALL标志实现需求,完整代码如下:
import re # 读取文件内容 with open('file.txt','r+') as f: content = f.read() # 正则模式说明: # \s+ 匹配目标字段前的缩进、换行空白,避免删除后残留多余空行 # (DATA_TO_MATCH|DATA_CATCHME) 匹配两个需要删除的目标字段 # \s*\{ 匹配字段后到块起始左花括号的空白和左花括号本身 # .*? 非贪婪匹配任意内容,直到遇到第一个闭合花括号停止 # \} 匹配块的闭合右花括号 pattern = r'\s+(DATA_TO_MATCH|DATA_CATCHME)\s*\{.*?\}' # 执行替换:flags=re.DOTALL 让.可以匹配换行符 cleaned_content = re.sub(pattern, '', content, flags=re.DOTALL) # 验证输出结果 print(cleaned_content) # 如需将处理后的内容写回文件,取消下方注释即可 # with open('file.txt', 'w') as f: # f.write(cleaned_content)
注意事项
- 该方案仅适用于目标花括号块内部无嵌套花括号的场景,和给出的样例结构完全匹配;如果后续存在多层括号嵌套的情况,正则无法准确处理括号配对逻辑,需要使用对应格式的专用语法解析器
- 非贪婪匹配符
.*?会匹配到离目标字段最近的一个},不会误删后续其他块的内容 - 模式开头的
\s+会自动清理目标块前的多余缩进和空行,输出结果和预期格式完全一致
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

