仅替换字符串中完全匹配的单词

时间:2018-08-10 20:28:52

标签: python regex list replace

我有一个名称列表,我希望当它们在字符串中完全出现时,将其替换为单词'PERSON'。但是,在下面的代码中,部分匹配项也被'PERSON'代替。

这就是我所拥有的:

test = 'Testes huius rey sunt hij, videlicet, Magnificus Dominus Periohannes de Mazara, nobilis Georgius de la Chabica, Nicolaus Manfridus de Caxario et alij.'

testres = re.compile("|".join(names)).sub('PERSON', test)

结果:

'Testes huius rey sunt hij, videlicet, Magnificus Dominus PERSONohannes de Mazara, nobilis PERSONorgius de la Chabica, PERSON PERSON de Caxario et alij.'

由于'Peri'在列表中,因此'Periohannes'被替换为'PERSONohannes'

我该如何解决?

2 个答案:

答案 0 :(得分:1)

不是加入名称列表,而是查找字符串中的所有单词,然后检查找到的每个单词是否属于names

import re
test = 'Testes huius rey sunt hij, videlicet, Magnificus Dominus Periohannes de Mazara, nobilis Georgius de la Chabica, Nicolaus Manfridus de Caxario et alij.'
new_test = re.sub('\w+', lambda x:'PERSON' if x.group() in names else x.group(), test)

答案 1 :(得分:0)

这是单词边界锚\b的作用:

>>> test = 'Testes huius rey sunt hij, videlicet, Magnificus Dominus Periohannes de Mazara, nobilis Georgius de la Chabica, Nicolaus Manfridus de Caxario et alij.'
>>> names = 'Nicolaus', 'Manfridus', 'Peri'
>>> names_regex = re.compile(r'\b'+'|'.join(names)+r'\b')
>>> names_regex.sub('PERSON',test)
'Testes huius rey sunt hij, videlicet, Magnificus Dominus Periohannes de Mazara, nobilis Georgius de la Chabica, PERSON PERSON de Caxario et alij.'
>>> test = 'Testes huius rey sunt hij, videlicet, Magnificus Dominus Periohannes de Mazara, nobilis Georgius de la Chabica, Nicolaus, Manfridus, de Caxario et alij.'
>>> names_regex.sub('PERSON',test)
'Testes huius rey sunt hij, videlicet, Magnificus Dominus Periohannes de Mazara, nobilis Georgius de la Chabica, PERSON, PERSON, de Caxario et alij.'

请注意,它的工作原理不仅限于两端的空格,也就是第二个示例中的逗号。