Regex заменяет спички

1

Предполагая, что у меня есть эта запись в словаре:

'Michaele Frendu': ['Micheli Frendu', 'Michael', 'Michaele']

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

то есть:

если у меня есть этот образец ввода:

s = 'concessit et assignavit Micheli Frendu presenti viridarium'

это будет заменено на:

s = 'concessit et assignavit Michaele Frendu presenti viridarium'

Проблема в том, что у меня уже есть Michaele Frendu в моем тексте, и Michaele также является элементом в списке ex:

s = 'Pro Michaele Frendu contra Lucam Zamit'

Это меняется на:

s = 'Pro Michaele Frendu Frendu contra Lucam Zamit'

где мой желаемый результат:

s = 'Pro Michaele Frendu contra Lucam Zamit'

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

Я использую этот шаблон регулярного выражения, но не работает:

my_regex = r"\b(?=\w)" + re.escape(l) + r"\b(?!\w)"
s = re.sub(my_regex, k, s)

где k - это ключ, а l - значение из списка

  • 0
    А как насчет простого постпроцесса, такого как .replace('Frendu Frendu', 'Frendu') ? Как вы строите шаблон и выполняете замены? Можете ли вы изменить значения словаря?
Теги:

1 ответ

1
Лучший ответ

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

import re
d = {'Michaele Frendu': ['Micheli Frendu', 'Michael', 'Michaele']}
s = 'Pro Michaele Frendu contra Lucam Zamit'
for k, v in d.items():
    print(re.sub('|'.join(map(re.escape, (k, *v))), k, s))

Эти результаты:

Pro Michaele Frendu contra Lucam Zamit

И с s = 'concessit et assignavit Micheli Frendu presenti viridarium', этот результат:

concessit et assignavit Michaele Frendu presenti viridarium

Для ясности обратите внимание, что '|'.join(map(re.escape, (k, *v))) возвращает во время итерации следующее:

Michaele\ Frendu|Micheli\ Frendu|Michael|Michaele

Ещё вопросы

Сообщество Overcoder
Наверх
Меню