如何使用Python正则表达式删除两个指定词之间的多行Fortran子例程内容
解决方案
你原有代码存在以下几个核心问题:
- 逐行读取文件内容,无法匹配跨行的子例程结构,正则的单行模式
(?s)在此场景下完全失效 re.sub参数使用错误,缺少「替换内容」参数,且错误传入文件路径变量input作为待处理字符串- 没有保留非子例程的原文内容,无论匹配结果都直接写入空行,会丢失正常文本
修正后的实现代码
import re # 替换为你自己的输入、输出文件路径 input_file = "你的Fortran源文件路径" output_file = "处理后的文件存储路径" # 一次性读取全量文件内容,适配跨行匹配需求 with open(input_file, 'r', encoding='utf-8') as f: raw_content = f.read() # 正则匹配规则说明: # (?s) 开启单行模式,让.可以匹配换行符 # SUBROUTINE\s+[A-Z]{6}\(.*?\) 匹配子例程开头,兼容名称后带空格、带括号参数的格式 # .*? 非贪婪匹配子例程内部所有内容,避免一次性删掉多个连续子例程 # \s*END\b 匹配结束标识END,兼容END前带任意空格的格式 sub_pattern = r"(?s)SUBROUTINE\s+[A-Z]{6}\(.*?\).*?\s*END\b" processed_content = re.sub(sub_pattern, "", raw_content) # 写入处理后的内容 with open(output_file, 'w', encoding='utf-8') as f: f.write(processed_content)
拓展适配说明
如果你的场景存在以下情况,可以对应调整正则规则:
- 子例程名称不固定为6位大写字母:将
[A-Z]{6}替换为[A-Z0-9_]+,可适配所有合法Fortran子例程命名 - 子例程可能没有参数:将
\(.*?\)替换为(\(.*?\))?,可适配带/不带参数的两种子例程开头格式
内容的提问来源于stack exchange,提问作者user10990669
相关产品推荐
相关产品推荐

