首页 > 解决方案 > 如果匹配列表元素,则屏蔽子字符串,Python

问题描述

我有一个任务:如果字符串的一部分与列表的元素匹配,我需要屏蔽它。

stringValue = "My name is Jackie Brown! I am from Louisiana."
surnameList = ["Brown", "Louisiana", ...]

在此示例中,所需的输出将是:

maskedString = "My name is Jackie *****! I am from *****."

被屏蔽的子字符串的长度(在本例中为 5 个 *)并不重要,只要该字符串被屏蔽即可。

这是我的初始功能:

import re
def maskSurname(stringValue, surnameList):
    indexList = []
    splitList = re.sub(r'[^\w\s]',' ',stringValue).split()
    for x in splitList:
        for z in surnameList:
            if x == z:
                index = splitList.index(x)
                indexList.append(index)
    for y in indexList:
        splitList[y] = "*****"
    return listToString(splitList)

这似乎完成了工作,但是,它删除了所有标点符号,这并不理想,但不是主要问题。该函数的输出maskSurname()是一个连接列表:

My name is Jackie ***** I am from *****

我将如何更有效地做到这一点?目前,要屏蔽的单词列表包含约 500 个单词。这些词真的没有模式,似乎我不能以我知道的方式使用正则表达式。这些函数将与 JSON 数据一起使用。

谢谢你。

标签: pythonmasking

解决方案


当您可以这样做时,为什么要使用正则表达式并增加开销str.replace

>>> stringValue = "My name is Jackie Brown! I am from Louisiana."
>>> surnameList = ["Brown", "Louisiana"]
>>> for i in surnameList:
...     stringValue = stringValue.replace(i, "*****")
... 
>>> stringValue
'My name is Jackie *****! I am from *****.'

推荐阅读