我有一个名称列表,我希望当它们在字符串中完全出现时,将其替换为单词'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'
我该如何解决?
答案 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.'
请注意,它的工作原理不仅限于两端的空格,也就是第二个示例中的逗号。