2014-10-07 2 views
0

Я хотел бы сравнить строку A с регулярным выражением R.Python difflib с regex

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.match и re.search. Теперь я хотел бы изучить различия между A и B, когда матч не работает.

Мой первый случай простой. Я заменяю regex ([A-Za-z]+) на (.+), чтобы узнать, соответствует ли проблема только в группе регулярных выражений. В этом случае я могу легко поднять вопрос, сказав, что синтаксис строки хорош для группы, определенной для имени.

Теперь, в случае неудачных шагов 1 и 2, я хотел бы сделать diff как HTML diff, но с регулярным выражением, чтобы определить, где не удалось выполнить регулярное выражение.

Я изучил difflib и функцию find_longest_match, но кажется, что эта функция работает только с символом на символ, а не с подстрокой.

Есть ли у вас какие-либо идеи или предложения по определению дифференциала на основе сравнения регулярных выражений и потенциально вычислить отношение, измеряющее сходство?

+0

Вам нужен двигатель, который будет делать parthial соответствия, или просто использовать каскадное optioal конструкции. Например: 'Hi (\ s + (my (\ s + (friend (, (\ s + (my (\ s + (name (\ s + (is ([A-Za-z] +)?)?)?)?)?)?)?)?)?)?)?)? ' – sln

ответ

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

или сделайте поиск Google для fuzzy string matching или Levenshtein distance

 Смежные вопросы

  • Нет связанных вопросов^_^