ПЕРВЫЙ ПОДХОД -
Ну, используя регулярные выражения, вы можете сделать это так -
import re
re.sub('g+', 'g', 'omgggg')
re.sub('l+', 'l', 'lollll')
и т.д.
Позвольте мне указать, что использование регулярных выражений является очень хрупким и базовым подходом к решению этой проблемы. Вы могли бы так легко получить строки от пользователей, которые нарушат вышеприведенные регулярные выражения. Я пытаюсь сказать, что этот подход требует значительных усилий в плане наблюдения за образцами ошибок, которые совершают пользователи, и последующего создания для них регулярных выражений для конкретных случаев.
ВТОРОЙ ПОДХОД -
Вместо этого вы рассматривали возможность использования difflib
модуля? Это модуль с помощниками для вычисления дельт между объектами. Здесь для вас особое значение имеет SequenceMatcher
. Перефразируя из официальной документации -
SequenceMatcher - гибкий класс
для сравнения пар последовательностей
любой тип, пока последовательность
элементы являются хэшируемыми. SequenceMatcher
пытается вычислить "дружественный человеку
diff "между двумя последовательностями.
фундаментальное понятие самый длинный
непрерывная и подпоследовательность соответствия без мусора.
import difflib as dl
x = dl.SequenceMatcher(lambda x : x == ' ', "omg", "omgggg")
y = dl.SequenceMatcher(lambda x : x == ' ', "omgggg","omg")
avg = (x.ratio()+y.ratio())/2.0
if avg>= 0.6:
print 'Match!'
else:
print 'Sorry!'
Согласно документации, любое отношение () свыше 0,6 близко соответствует. Возможно, вам придется изучить настройку соотношения для ваших потребностей в данных. Если вам нужно более строгое соответствие, я нашел, что любое значение выше 0,8 хорошо подойдет.