根据未知模式匹配不匹配的字符串

时间:2010-04-03 12:21:47

标签: regex

好吧,伙计们,我真的伤害了我的大脑而且我很好奇你们是否可以给我指向我应该采取的正确方向。

情况如下:

让我们说,我有一个字符串集合(很明显这个字符串的模式是未知的。事实上,我可以说字符串只包含来自ASCII表的符号,因此,我不知道不得不担心奇怪的中国标志。)

对于这个例子,我采用以下字符串集合(请注意,字符串不必具有任何人类意义,所以不要尝试将它们弄清楚:)):

"[001].[FOO].[TEST] - 'foofoo.test'",  
"[002].[FOO].[TEST] - 'foofoo.test'",  
"[003].[FOO].[TEST] - 'foofoo.test'",  
"[001].[FOO].[TEST] - 'foofoo.test.sample'",  
"[002].[FOO].[TEST] - 'foofoo.test.sample'",    
"-001- BAR.[TEST] - 'bartest.xx1",  
"-002- BAR.[TEST] - 'bartest.xx1"  

现在,我需要的是找到这些字符串集的逻辑组(和子组)的方法,所以在上面的例子中,仅仅通过理性思考,你可以结合前面的3和之后的2和最后的2.同样来自前5个的结果组可以组合成一个主要组和2个子组,这应该给你这样的东西:

{
    {
        "[001].[FOO].[TEST] - 'foofoo.test'",  
        "[002].[FOO].[TEST] - 'foofoo.test'",  
        "[003].[FOO].[TEST] - 'foofoo.test'",  
    }
    {
        "[001].[FOO].[TEST] - 'foofoo.test.sample'",  
        "[002].[FOO].[TEST] - 'foofoo.test.sample'",    
    }
}
{
    {
        "-001- BAR.[TEST] - 'bartest.xx1",  
        "-002- BAR.[TEST] - 'bartest.xx1"  
    }
}

对于上面的布局感到抱歉,但是缩进4个空格似乎无法正常工作(或者我正在使用它)。

无论如何,我不知道如何解决这个问题(如何获得如上所示的结果)。

首先,我考虑创建一组大量的正则表达式来解析大多数已知的模式,但不同模式的数量只是巨大的,这是不现实的。

我想到的另一个想法是解析字符串中的每个单词(所以删除所有非字母或数字字符并按这些字符拆分),如果X%匹配,我可以假设字符串属于同一个组。 (其中X可能在80/90左右)。但是,我发现投机领域有点大。例如,当匹配每个20个字的字符串时,80%以上的命中率变化有点大(这意味着4个字可以不同),但是当仅匹配8个字时,最多2个字可以不同。

我的问题是,在上述情况下,什么是合乎逻辑的做法?

至于reallife的例子:

提前致谢!

5 个答案:

答案 0 :(得分:3)

基本上我会认为每个字符串都是一个字符包。我将在两个字符串之间定义一种距离,它类似于“属于两个字符串的字符数”除以“字符串1中的字符总数+字符串2中的字符总数”。 (好吧,从数学上说它不是距离......)然后我会尝试将一些算法应用到cluster你的字符串集。

嗯,这只是一个基本想法,但我认为这是尝试一些实验的良好开端......

答案 1 :(得分:1)

你的问题不容易理解,但我认为你提出的问题是不可能以令人满意的方式给出任何一组字符串。以这些字符串为例:

[1].[2].[3].[4].[5]
[a].[2].[3].[4].[5]
[a].[b].[3].[4].[5]
[a].[b].[c].[4].[5]
[a].[b].[c].[d].[5]
[a].[b].[c].[d].[e]

每个都接近旁边列出的那些,所以他们应该与他们的邻居分组,但是第一个和最后一个是完全不同的,所以将它们组合在一起是没有意义的。给定一个更“分组”的数据集,你可以通过像PierrOz描述的方法得到相当好的结果,但不能保证有意义的结果。

我可以询问目的是什么吗?这将使我们所有人都能更好地理解可以容忍哪些错误,或者甚至可能采用不同的方法来解决问题。

编辑:我想知道,如果一个字符串最终出现在多个不同的组中,它会好吗?这可以使问题变得更加简单,并且更可靠地为您提供有用的信息,但最终会得到一个更大的分组树,同一节点被复制到不同的分支。

答案 2 :(得分:1)

我建议使用此:http://en.wikipedia.org/wiki/Hamming_distance作为距离。

另外,对于文件,一个好的启发式方法是在计算距离之前从文件名中删除校验和:

[BSS]_Darker_Than_Black_-_The_Black_Contractor_-_Gaiden_-_01_[35218661].mkv
->
[BSS]_Darker_Than_Black_-_The_Black_Contractor_-_Gaiden_-_01_.mkv

支票很简单 - 它总是10个字符,第一个是[,最后一个是],其余的是ALPHA-numeric:)

启发式和最大距离为4,你的东西将适用于绝大多数情况。

祝你好运!

答案 3 :(得分:1)

在@PierrOz'答案的基础上,您可能希望尝试多种度量,并对这些度量进行统计cluster analysis

例如,您可以使用四种方法:

  1. 多少个字母(大写/小写)
  2. 多少位数
  3. ([,],。)
  4. 中有多少
  5. 上面没有包含多少其他字符(可能)
  6. 在这个例子中,你有每个字符串的四个度量,如果你愿意,你可以为每个度量应用不同的权重。

    R具有许多用于聚类分析的功能。 This might be a good starting point


    事后想法:措施几乎可以是你发明的任何东西。还有一些例子:

    • Binary:字符串是否包含给定字符(0或1)?
    • Binary:字符串是否包含给定的子字符串?
    • 计数:给定子字符串出现多少次?
    • Binary:字符串是否包含 all 这些字符?

    足够至少一个周末的修补......

答案 4 :(得分:0)

我很想用聚类分析技术解决这个问题。点击维基百科的介绍。其他答案可能属于聚类分析领域,但您可以通过更广泛的阅读找到一些其他有用的方法。