Маскирование подстроки, если она соответствует элементу списка, Python

#python #masking

#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'[^ws]',' ',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.

Спасибо.

Комментарии:

1. Это не идеально, но вы можете попробовать что-то вроде этого: re.sub('|'.join(surnameList), '*****', stringValue)

Ответ №1:

Зачем использовать регулярные выражения и добавлять накладные расходы, когда вы можете просто сделать 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 *****.'
 

Комментарии:

1. Это отличное решение, спасибо! Однако это создает уязвимость для чувствительности к регистру. Я не могу добавить. lower() до i в цикле for .