如何用Python的re库处理ENDF数据中的特殊科学计数法?
解决ENDF数据特殊科学计数法的Python正则替换方案
要处理ENDF文件里省略e的科学计数法(如1.234-3对应1.234e-3),同时避免误替换负数开头的负号,用Python的re库结合正向预查+捕获组就能实现精准替换。
核心思路
只替换紧跟在数字之后的+或-(也就是指数部分的符号),忽略开头的负号(表示数值本身为负)。
实现代码
import re def convert_endf_sci_notation(input_str): # 匹配数字后的+/-,替换为e+/- return re.sub(r'(?<=\d)([+-])', r'e\1', input_str)
正则表达式说明
(?<=\d):正向肯定预查,确保匹配的+/-前面是一个0-9的数字,排除开头的负号。([+-]):捕获组,把指数部分的符号存为分组1。r'e\1':替换时在捕获的符号前加上e,还原标准科学计数法。
测试验证
# 测试用例 test_cases = [ "1.234-3", # 正数带负指数 "-5.122-5", # 负数带负指数 "9.876+2", # 正数带正指数 "-1.000+0", # 负数带0指数 "123-4", # 整数形式 ".123-5" # 无前缀整数的小数 ] for case in test_cases: print(f"原字符串: {case:10} → 转换后: {convert_endf_sci_notation(case)}")
输出结果:
原字符串: 1.234-3 → 转换后: 1.234e-3 原字符串: -5.122-5 → 转换后: -5.122e-5 原字符串: 9.876+2 → 转换后: 9.876e+2 原字符串: -1.000+0 → 转换后: -1.000e+0 原字符串: 123-4 → 转换后: 123e-4 原字符串: .123-5 → 转换后: .123e-5
补充说明
这种特殊格式源于Fortran 80字符卡片的存储限制,通过上述正则可以完美兼容所有合法的ENDF数字格式,不会出现误替换负数开头的问题。
内容的提问来源于stack exchange,提问作者villaa
相关产品推荐
相关产品推荐

