反转sprintf /格式的方法

时间:2011-02-11 08:19:53

标签: algorithm string language-agnostic pattern-matching format-string

我必须通过分析格式化结果来启发式地确定格式模式字符串。

例如我有这些字符串:

  

您有 3 条未读讯息。

     

您有 10 条未读讯息。

     

对不起,戴夫。我恐怕不能那样做。

     

对不起, Frank 。我恐怕不能那样做。

     

这句话是错误的。

我想得到这些格式字符串:

  

您有%s 未读消息

     

对不起,%s 。我恐怕不能那样做。

     

这句话是错误的。

哪些方法和/或算法可以帮助我?

我的第一个想法是使用机器学习的东西,但我的胆量告诉我这可能是一个相当经典的问题。

一些额外要求:

  • 参数的类型无关紧要,即如果参数最初是%s%d,或者填充或对齐,我就不需要这些信息。
  • 可以有多个参数(或根本没有参数)
  • 通常,数据由数千个格式化字符串组成,但只有数十种格式模式。

1 个答案:

答案 0 :(得分:1)

  1. 通过一些相似度量对字符串进行聚类(我尝试了最长公共子序列的长度,LCS)。如果你事先不知道,Determining the number of clusters是很难的部分。

  2. 在每个群集中,确定其中所有字符串的LCS,记录发生的间隙的位置。用%s替换间隙。 (您可能希望构建一个函数,该函数返回基于LCS的格式字符串以及集群上的fold / reduce。)

  3. 上面是一个贪婪的算法,给定{foobarfooBaR}会产生foo%sa%s。您可能希望以递归方式替换单个%s由单个字符(或单个非空白字符等)分隔的%s出现的任何一对。