2014-10-07 180 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