You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动