Предполагая, что у меня есть эта запись в словаре:
'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 - значение из списка
Вы можете просто разместить замену в первом списке чередования регулярных выражений, чтобы он заменил замену собой, с более высоким приоритетом, чем альтернативные ключевые слова:
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
.replace('Frendu Frendu', 'Frendu')
? Как вы строите шаблон и выполняете замены? Можете ли вы изменить значения словаря?