Вероятно, я мог бы использовать лучший английский, но я хочу игнорировать акцент (и тому подобное) в словах, поэтому:
renè, rené, rene' и rene должны быть одинаковыми, поэтому должно быть
mañana и manana или
even-distribuited и even distribuited и возможно
shouldn't и shouldnt
Я помню функцию (заимствованную из журналистики), используемую, например, для адресов интернет-страниц, которые должны удалять пробелы, акценты и т. д., но я не помню названия. Я думаю, это должно работать, но допускается другой способ
Спасибо
Во второй части вы можете просто re.sub убрать ненужных вам персонажей.






Кажется, в этом вопросе обсуждается стандартный подход к избавлению от специальных символов . Но, возможно, вы могли бы рассмотреть другой подход, который часто называют нечетким сопоставлением (или нечетким поиском).
[...] метод поиска строк, которые приблизительно (а не точно) соответствуют шаблону
В Python для этого можно использовать TheFuzz. Вот попытка на основе ваших примеров.
from thefuzz import fuzz
tuples = [("mañana", "manana"), ("shouldn't", "shouldnt"), ("even-distribuited", "even distribuited")]
for tuple in tuples:
print(f"{tuple[0]} vs {tuple[1]}: {fuzz.ratio(tuple[0], tuple[1])}")
# mañana vs manana: 83
# shouldn't vs shouldnt: 94
# even-distribuited vs even distribuited: 94
Таким образом, вы можете определить правило, основанное на соотношении, чтобы сделать вывод о совпадении между двумя строками.
Вы даже можете объединить нормализацию Юникода и нечеткое сопоставление для достижения лучших результатов.
tuples = [("mañana", "manana"), ("shouldn't", "shouldnt"), ("even-distribuited", "even distribuited")]
def compare(tuples, unicode=True):
for t in tuples:
if unicode:
t = tuple(map(lambda x: unicodedata.normalize(u'NFKD', x).encode('ascii', 'ignore').decode('utf8'), t))
print(f"{t[0]} vs {t[1]}: {fuzz.ratio(t[0], t[1])}")
compare(tuples)
# manana vs manana: 100
# shouldn't vs shouldnt: 94
# even-distribuited vs even distribuited: 94
Возможный дубликат: stackoverflow.com/q/517923/13951118