如何从格式化字符串中找到字符串模板?

5

假设我有一个字符串模板,例如:

string="This is a {object}"

现在我通过格式化这个字符串创建了两个(或者更多)字符串,即:
string.format(object="car")
=>"This is a car"

string.format(object="2020-06-05 16:06:30")
=>"This is a 2020-06-05 16:06:30"

现在我已经不知道原来的字符串是什么了。有没有办法使用我现在拥有的2个新字符串找到原始字符串?

注意:我有一组这些字符串的数据集,这些字符串是从模板创建的,但由于编辑,原始模板丢失了。从新模板创建了新字符串,并放入同一数据集中。我尝试使用一些基于机器学习的方法,但似乎在一般情况下都不起作用。我正在寻找一种算法,它能够给我返回原始字符串,这可以是一个或一组字符串,如果模板已经被多次更改。


通常情况下,无法从输出和输入返回到模板。例如,对于"This car is a {thing}".format(thing="car")中的"This car is a car""car",结果应该是什么? - jonrsharpe
3个回答

2

一种可能的方法是匹配输入字符串中的单词和格式化值选项,然后进行比较:

import re
def get_vals(s):
   return re.findall('[\d\-]+\s[\d:]+|\w+', s)

vals = ["This is a car", "This is a 2020-06-05 16:06:30"]
r = ' '.join('{object}' if len(set(i)) > 1 else i[0] for i in zip(*map(get_vals, vals)))

输出:

'This is a {object}'

0
你可以使用许多主要用于对齐DNA序列的“序列比对”算法之一。这将返回字符串中保留的序列。然后,您可以保留保守区域,并在发生“突变”的地方添加占位符以获取模板。 https://en.wikipedia.org/wiki/Multiple_sequence_alignment 可以帮助您入门。

作为一个熟悉序列比对的人,我不清楚这如何帮助解决问题,您能否在回答中再详细解释一下?谢谢。 - user5359531

0

你可以找到模板的位置,但是可能无法理解模板中的名称,因此通过获取两个字符串之间的差异,您可以了解模板字符串的位置。

请参考Python - getting just the difference between strings以获取有关如何获取两个字符串之间差异的建议。

以下是一些可能作为起点的步骤:

  1. 将字符串A和B之间的差异作为列表收集,仅从A中收集字符串。
  2. 初始化模板= A
  3. 迭代不同的字符串并将它们替换为模板中的{}

最后,您将从A中获得模板字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接