2016-07-12 7 views
1

Итак, я в противоречивой ситуации, и я хотел получить совет. В основном я просто выполняю сопоставление строк, используя извлеченную строку в качестве шаблонов для моего обычного выражения. Хотя в целом я могу сделать это довольно хорошо в целом с помощью поиска с нечетким регулярным выражением, иногда я сталкиваюсь с этой ситуацией:Regex - соответствие подстроки текста подстроке шаблона

Предположим, что я извлек следующий шаблон из некоторых данных (пакет регулярных выражений Python).

pattern = 'the quick brown fox jumps over the lazy dog' 

Теперь мне нужно, чтобы он соответствовал строке, которая может быть похожа на любую из этих, хотя в основном первая.

string = 'quick brown fox jumps over the lazy' 
string2 = 'and then a quick brown fox jumps onto the cat' 

в связи с началом и задними символами, очевидно, я не получу матч, если я пытаюсь сделать что-то вроде того, что я делаю, что в настоящее время выглядит следующим образом:

if re.search("("+pattern+"){e<=2}", string): 
    print(True) 

К сожалению, количество ошибок не является согласованным, и может быть много символов, ведущих и/или заканчивающих шаблон. Учитывая, что я не знаю a priori, если я столкнулся с этой проблемой, могу ли я что-нибудь сделать, чтобы получить соответствие, если достаточная подстрока шаблона соответствует ему? Я смотрел на расстояние Левенштейна, чтобы объяснить это, но для этого требуется установить некоторый порог, который кажется суперчувствительным к длине строк, чтобы соответствовать (после нормализации по длине), и поэтому он просто заканчивается тем, получить матч, когда я этого хочу. Есть ли другие варианты или лучшие способы нормализации результатов?

Кроме того, одна вещь, которую я не могу сделать, - всегда просто наилучшее совпадение, потому что иногда правильная запись на самом деле не появляется в тексте, который я проверяю.

Все, что я пропустил в пакете регулярных выражений, которое могло бы помочь в этом?

+0

Вы проверили 'nltk'? Похоже, что вы хотите сравнить частоты стебля слова (с весом, зависящим от общей частоты слов), в своих строках и вернуть лучшие совпадения. Я думаю, что «nltk» поддерживает это. http://textminingonline.com/dive-into-nltk-part-iv-stemming-and-lemmatization – dashiell

+0

Что такое * достаточная подстрока шаблона *? Это значение, которое вы обычно должны рассчитать и использовать вместе с функцией расстояния Левенштейна. –

+0

Как насчет слов чередующихся, таких как 'string = 'quick blah brown blah fox blah blog jumps blow over blech the crazy''? – dawg

ответ

0

Ouf, мне потребовалось некоторое время, чтобы прийти с этим (я не разработчик питона), но это должно сделать трюк:

import re 

sentence = "the quick brown fox jumps over the lazy dog" 
string = 'quick brown fox jumps over the lazy' 
string2 = 'and then a quick brown fox jumps onto the cat' 
count1 = 0 
count2 = 0 


pattern = re.sub(
    '(\w+\s*)', 
    '\\1|', 
    sentence 
) 

pattern ="(?:(?!" + pattern.rstrip("|") + ").|" + re.sub(
    '(\w+\s*)', 
    '(\\1){0,1}', 
    sentence 
) + ")+" 

results = re.match(
    pattern, 
    string 
) 

total = len(results.groups()) 

for index in range(1, total): 

    if results.group(index): 
     count1 = count1 + 1 

results = re.match(
    pattern, 
    string2 
) 

for index in range(1, total): 

    if results.group(index): 
     count2 = count2 + 1 

message = 'The following string:"' + string + '" matched ' + str(count1) + ' time and the following string:"' + string + '" matched ' + str(count2) + ' time.' 

Испытано здесь: http://www.pythontutor.com/visualize.html#mode=edit

enter image description here