Python正则表达式匹配PyBobyQa日志f值缺失问题求助
优化PyBobyQa日志中f值的正则提取方案
问题核心
你的现有正则表达式无法覆盖PyBobyQa日志中所有函数评估的f值格式(比如整数、科学计数法、带正负号的数值),导致仅能匹配部分记录。
优化后的正则表达式
针对PyBobyQa日志的常见格式,使用以下正则可以捕获所有合法的f值:
r"\s*Function evaluation \d+: f = ([+-]?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)"
正则说明
\s*: 匹配行首可能存在的任意空格(处理日志缩进)Function evaluation \d+: 匹配固定前缀,\d+匹配任意数字的评估次数: f =: 匹配中间的标识文本,若日志中空格数量不固定,可替换为:\s*f\s*=\s*匹配任意空格([+-]?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?): 捕获f值,支持:- 正负号(
[+-]?) - 整数(如
987、0) - 小数(如
0.1234、-12.34) - 科学计数法(如
5.678e-03、1.0000e+02)
- 正负号(
完整代码示例
import re # 读取日志文件(替换为你的日志路径) with open("pybobyqa_log.txt", "r", encoding="utf-8") as f: log_content = f.read() # 编译正则(提升重复匹配效率) f_value_pattern = re.compile(r"\s*Function evaluation \d+: f = ([+-]?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)") # 提取所有f值并转为浮点数 all_f_values = [float(match.group(1)) for match in f_value_pattern.finditer(log_content)] # 输出结果 print("所有函数评估的f值:") for idx, f_val in enumerate(all_f_values, 1): print(f"评估{idx}: {f_val}")
调试建议
如果仍有匹配不到的行,可将无法匹配的日志行单独提取,检查是否存在格式变体(比如前缀文本差异、特殊字符),再针对性调整正则的对应部分。
内容的提问来源于stack exchange,提问作者Andrew Lindsay
相关产品推荐
相关产品推荐

