#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 .