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

如何判断一个字符串是否可通过格式化另一个字符串生成?

验证字符串是否由指定格式化模板生成

Python标准库没有直接提供反向解析格式化字符串的工具,但可以借助string.Formatter(str.format的底层实现类)来复用原有格式化逻辑,无需自己从零实现复杂的规则(比如转义大括号、占位符解析等)。

核心实现思路

  1. 解析模板结构:用string.Formatter.parse拆分模板中的字面量文本和占位符,确保准确识别转义的{{/}}以及各种占位符类型。
  2. 生成匹配规则:基于解析结果构建正则表达式,匹配目标字符串的结构。
  3. 反向验证:将匹配到的内容代入原模板,验证重新格式化后的结果是否与目标字符串完全一致,避免正则误判。

示例代码

import string
import re

def is_generated_by_format(s: str, fmt_str: str) -> bool:
    formatter = string.Formatter()
    parsed_parts = list(formatter.parse(fmt_str))
    
    regex_segments = []
    for literal, field, _, _ in parsed_parts:
        # 转义正则特殊字符,保留字面量的原始匹配逻辑
        regex_segments.append(re.escape(literal))
        if field is not None:
            # 匹配任意非终止内容(可根据格式说明调整,比如数字匹配\d+等)
            regex_segments.append(r"(.*?)")
    
    # 构建完整正则,匹配整个字符串
    full_regex = "^" + "".join(regex_segments) + "$"
    match_result = re.fullmatch(full_regex, s)
    
    if not match_result:
        return False
    
    # 代入参数重新格式化,验证一致性
    try:
        return fmt_str.format(*match_result.groups()) == s
    except (TypeError, ValueError):
        return False

# 测试基础场景
f = "The object named '{}' is corrupted."
s = "The object named 'my_object' is corrupted."
print(is_generated_by_format(s, f))  # 输出: True

# 测试转义大括号场景
f_escaped = "This is a {{fixed}} part with {} variable."
s_escaped = "This is a {fixed} part with test variable."
print(is_generated_by_format(s_escaped, f_escaped))  # 输出: True

注意事项

  • 对于带格式说明的占位符(比如{:.2f}),需要修改正则匹配规则,比如将(.*?)替换为(\d+\.\d{2}),再验证格式化结果,确保符合格式约束。
  • 关键字参数模板(比如{name})可以通过解析field名称,构建关键字参数字典后验证,逻辑类似但需要调整参数传递方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:22:28