如何用Python删除或过滤关键词界定范围内的文本内容?
嘿,这两个Python文本处理的问题我熟,给你一步步讲清楚解法!
1. Python删除文件中关键词界定范围内的行
如果要删除文件里从某个起始关键词到结束关键词之间的所有行(包括这两个关键词所在的行),可以用逐行遍历+标记区间的方式来实现,逻辑清晰也好调整。
比如下面这个函数,你只需要传入文件路径、起始关键词和结束关键词就行:
def delete_lines_between_keywords(file_path, start_keyword, end_keyword): # 先把文件所有行读进来 with open(file_path, 'r', encoding='utf-8') as f: lines = f.readlines() new_lines = [] in_delete_zone = False # 标记是否处于要删除的区间内 for line in lines: # 遇到起始关键词,进入删除模式,跳过当前行 if start_keyword in line: in_delete_zone = True continue # 遇到结束关键词,退出删除模式,跳过当前行 if end_keyword in line: in_delete_zone = False continue # 不在删除区间的行,保留下来 if not in_delete_zone: new_lines.append(line) # 把处理后的内容写回原文件(注意:会覆盖原文件,建议先备份!) with open(file_path, 'w', encoding='utf-8') as f: f.writelines(new_lines) # 示例调用:删除test.txt中从START_DELETE到END_DELETE之间的行 delete_lines_between_keywords('test.txt', 'START_DELETE', 'END_DELETE')
要是你想保留起始或结束行,只要去掉对应的continue就行——比如保留起始行,就删掉if start_keyword in line:块里的continue。
2. Python过滤两段字符串之间的文本内容(以你的SQL示例为例)
针对你说的SQL文本过滤需求,用正则表达式是最方便的,尤其是处理这种“从A到B之间的内容全部删掉”的场景。
直接看代码,我已经适配了你的SQL示例:
import re def filter_between_strings(text, start_str, end_str): # 用re.escape转义关键词里的特殊字符(比如SQL里的空格、括号),避免正则报错 # .*?是非贪婪匹配,确保匹配到最近的结束关键词,而不是最远的 # re.DOTALL让.能匹配换行符,支持跨多行的内容 pattern = re.compile(re.escape(start_str) + r'.*?' + re.escape(end_str), re.DOTALL) # 把匹配到的内容替换成空字符串 return pattern.sub('', text) # 测试你的SQL示例 sql_text = """CREATE TABLE some_name ( fv int, sv int, tv int) CLUSTERED BY (fv, sv, tv) SORTED BY (fv, sv, tv) INTO 2 BUCKETS; -- more text afterwards""" # 这里结束关键词用"BUCKETS;",这样就能把中间的CLUSTERED BY...BUCKETS;全部删掉 result = filter_between_strings(sql_text, 'CLUSTERED BY', 'BUCKETS;') print(result)
运行后输出就是你想要的:
CREATE TABLE some_name ( fv int, sv int, tv int) -- more text afterwards
如果你的文本是多行的,re.DOTALL参数一定要加上,不然正则只会匹配单行内的内容;要是确定都是单行,去掉这个参数也没问题。
内容的提问来源于stack exchange,提问作者Vadim Yermolenko




