【问题标题】:Replacing only the fully matched words in a string仅替换字符串中完全匹配的单词
【发布时间】:2018-08-10 20:28:51
【问题描述】:

我有一个名称列表,我希望当它们全部出现在字符串中时,它们被替换为单词'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'

我该如何解决这个问题?

【问题讨论】:

  • 使用 sorted(names,reverse=True) 代替 'names'。

标签: python regex list replace


【解决方案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)

【讨论】:

    【解决方案2】:

    这就是词边界锚,\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.'
    

    注意,它的工作原理不仅仅是两端的空格......即在第二个示例中使用逗号。

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多