You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:24:04