2014-10-07 96 views
0

我想比较字符串A与正则表达式R蟒蛇difflib与正则表达式

A = u'Hi my friend, my name is Julio' 
R = r'Hi\s+my\s+friend,\s+my\s+name\s+is([A-Za-z]+)' 

在这个时候,我可以很容易地知道,如果语法是好感谢re.matchre.search。现在我想在比赛不起作用的时候研究A和B之间的区别。

我的第一种情况很简单。我用(.+)替换了正则表达式([A-Za-z]+),以知道问题是否仅在正则表达式组匹配中。在这种情况下,我可以很容易地提出这个问题,说明字符串语法对于为该名称定义的组是好的。

现在在步骤1和步骤2失败的情况下,我想做一个差异像HTML diff,但用正则表达式来识别正则表达式失败的位置。

我研究了difflibfind_longest_match函数,但它似乎只对每个字符的字符而不是子字符串。

您是否有任何想法/建议来识别基于正则表达式比较的差异,并可能计算测量相似度的比率?

+0

做谷歌搜索你需要一个引擎,将做parthial匹配,或者只是使用级联optioal结构。如:(\ s +(我的(\ s +(朋友(,(\ s +(my(\ s +(name(\ s +(is([A-Za-z] +)?)?)?)?)? )?)?)?)?)?)?)?' – sln 2014-10-07 16:31:51

回答

0

从你的问题中,你确切需要的不是100%清楚,因为答案将取决于一般情况的性质,而你只举了一个例子。不过,假设你的答案是典型的,我有几个建议。

你的正则表达式大多只是字面字符串匹配,最后只有一点正则表达式。所以如果你从正则表达式匹配中分割出字符串匹配,这可能会有所帮助。喜欢的东西:

into = u'Hi my friend, my name is ' 
name_r = '([A-Za-z]+)' 

if not test_string.startsWith(intro): 
    return do_string_diff(test_string) 

name = test_string.split(intro)[-1] 
if not re.match(name_r, name): 
    return do_re_diff(test_string) 

return true 

您可以在difflib已经做了你需要的字符串比较,否则你可能会推出自己找到的东西。这取决于你的具体需求。

您可能会发现一些有用的东西在这里:https://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison

fuzzy string matchingLevenshtein distance