如何判断一个字符串是否可通过格式化另一个字符串生成?
验证字符串是否由指定格式化模板生成
Python标准库没有直接提供反向解析格式化字符串的工具,但可以借助string.Formatter(str.format的底层实现类)来复用原有格式化逻辑,无需自己从零实现复杂的规则(比如转义大括号、占位符解析等)。
核心实现思路
- 解析模板结构:用
string.Formatter.parse拆分模板中的字面量文本和占位符,确保准确识别转义的{{/}}以及各种占位符类型。 - 生成匹配规则:基于解析结果构建正则表达式,匹配目标字符串的结构。
- 反向验证:将匹配到的内容代入原模板,验证重新格式化后的结果是否与目标字符串完全一致,避免正则误判。
示例代码
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
相关产品推荐
相关产品推荐

