正则表达式替换匹配

时间:2018-10-12 09:57:25

标签: python regex

假设我在字典中有此条目:

'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是列表中的值

1 个答案:

答案 0 :(得分: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