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

如何以非正则方式提取旧式Python日志格式字符串的占位符名称

提取旧式Python格式字符串中的占位符(无需手动写正则)

当然有办法!不用手动编写正则表达式,我们可以利用Python本身的特性或者内置模块的能力来提取这些%(name)s格式的占位符,下面分享两个实用的方法:

方法1:利用自定义字典捕获键访问

这个方法的核心是利用%格式化操作符的工作机制:当用字典作为格式化参数时,Python会逐个查找占位符对应的键。我们可以创建一个自定义字典类,在每次键被访问时记录下来:

class PlaceholderCapture(dict):
    def __init__(self):
        self.captured = []
        super().__init__()
    
    def __getitem__(self, key):
        self.captured.append(key)
        return ""  # 返回空字符串,避免格式化报错

# 示例格式字符串
fmt_string = '%(levelname)s %(asctime)s %(category)s %(message)s'

capture_dict = PlaceholderCapture()
# 尝试格式化,触发所有键的访问
try:
    fmt_string % capture_dict
except:
    pass

# 现在captured列表里就是所有占位符名称
print(capture_dict.captured)  # 输出: ['levelname', 'asctime', 'category', 'message']

这个方法简单可靠,完全不需要正则,不管是logging的标准占位符还是自定义的未知占位符,都能被准确捕获。

方法2:借助logging.Formatter的内置解析

如果你正在处理的是日志格式字符串,那么可以直接利用logging.Formatter的私有解析方法(注意:私有方法可能随Python版本变化,但在当前主流版本中都稳定可用):

import logging

fmt_string = '%(levelname)s %(asctime)s %(category)s %(message)s'
formatter = logging.Formatter(fmt_string)

# _parse方法会返回格式字符串的解析结果,其中第二个元素就是占位符名称
placeholders = [field for _, field, _, _ in formatter._parse(fmt_string)]
print(placeholders)  # 输出: ['levelname', 'asctime', 'category', 'message']

这个方法的好处是专门针对日志格式字符串优化,能自动忽略掉格式字符串中的其他内容(比如固定文本、格式修饰符),直接提取出需要的占位符名称。如果你的代码需要长期维护,第一种自定义字典的方法会更稳妥,毕竟私有方法存在变更风险。

内容的提问来源于stack exchange,提问作者GergelyPolonkai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:11:30