Функция, в которой слова не заменяются с помощью Regex

У меня есть сценарий, в котором я анонимизирую личные данные, поэтому, когда в строке есть слова, начинающиеся с заглавных букв, они заменяются другой функцией (то есть анонимизируют имена).

Я хочу написать функцию, в которой регулярное выражение ищет слова, заданные в списке. Если строка содержит одно из слов в данном списке, его не следует заменять. Приведу пример: Мейн Наам - это Ким и Хеб, который учился в Университете Амстердама.

Поэтому, поскольку Universiteit van Amsterdam написано заглавными буквами, оно будет анонимизировано другой функцией. Я хочу создать дополнительную функцию, использующую Regex, где заданный список с определенными словами будет игнорироваться, когда строка соответствует словам в списке.
У меня есть функция, которая заменяет ее, но я хочу, чтобы слова совпадений игнорировались.

Это функция, которая анонимизирует имена**

def anonymizeNames(sentence):
    '''
        :param sentence: the input sentence
        :return: the sentence without names
    '''

    ##define x
    x = ""

    ##Check naam: indication
    names0Reg = "[Aa]chternaam:|[Vv]oornaam:|[Nn]aam:|[Nn]amen:"
    res = re.search(names0Reg, sentence)
    if res != None:
        ##Achternaam:, voornaam: or naam: or namen: occurs; next Standardize
        sentence = re.sub('[Nn]amen:', 'naam:', sentence)
        sentence = re.sub('[Aa]chternaam:', 'naam:', sentence)
        sentence = re.sub('[Vv]oornaam:', 'naam:', sentence)
        sentence = re.sub('Naam:', 'naam:', sentence)

        ##Extract names
        names00Reg = "naam: [A-Za-z]+"
        x = re.findall(names00Reg, sentence)
        for y in x:
            ##remove naam:\s
            y = re.sub('naam: ', '', y)
            ##Check for tussenvoegsels
            if y in tussenVList:
                ##Add next word
                regTest = y + " " + "[A-Za-z]+"
                x2 = re.search(regTest, sentence)
                if x2 != None:
                    ##Name found
                    y = x2.group()
                    ##replace
                   sentence = re.sub(y, strz, sentence)

    ##Always check sentences for names 1
    names1Reg = "[Ii]k [Bb]en ([A-Z]{1}[a-z ]{2,})+[\\.\\,]*"
    res = re.search(names1Reg, sentence)
    if res != None:
        ##adjust result
        x = re.sub('[Ii]k [Bb]en ', '', res.group())
        x = re.sub('[\\,\\.]', '', x)
        ##use NLP to only keep names
        

    ##Always check sentences for names 2
    names2Reg = "[Mm]ijn [Nn]aam is ([A-Z]{1}[a-z\s-]{2,})+[\\.\\,]*"
    res = re.search(names2Reg, sentence)
    if res != None:
        ##adjust result
        x = re.sub('[Mm]ijn [Nn]aam is ', '', res.group())
        x = re.sub('[\\,\\.]', '', x)
        ##use NLP to only keep names
        

    ##Check for single letter followed by dot and series of letters
    if x == "":
        regNameLet = "^[A-Z]{1}\\.[A-Za-z]{2,}|\s[A-Z]{1}\\.[A-Za-z]{2,}"
        res = re.search(regNameLet, sentence)
        if res != None:
            ##replace word in sentence, first at start
            sentence = re.sub('^[A-Z]{1}\\.[A-Za-z]{2,}', strz, sentence)
            ##next in sentence with additional space
            strY = " " + strz
            sentence = re.sub('\s[A-Z]{1}\\.[A-Za-z]{2,}', strz, sentence)

    ##Check for occurence of two subsequent uppercase words (might be a name)
    if x == "":
        res = re.findall("[A-Z]{1}[a-z]{2,}\s[A-Z]{1}[a-z]{2,}", sentence)
        if res != []:
            for y in res:
                if len(y) > 1:
                    ##replace name with strX
                    sentence = re.sub(y, strz, sentence)

    ##Always recheck remaining sentence with NLP to make sure all personal info is removed
    sentence = pureNLP2(sentence)  ##pureNLP2 tries to include entity checks

    return (sentence)

Это моя функция для поиска названий университетов, и с помощью этой функции я не хочу их заменять.

school ['Hogenschool Amsterdam', 'Universiteit van Amsterdam']
strX='xxx'

def school (sentence):
   for schoolname in school:
     res = re.findall(schoolname,sentence)
     if res !=[]:
        for y in res:
            if len(y) >1:
               sentence = replaceNice(sentence, strX, y)
      return(sentence)
print(school('Mijn naam is Kim en ik volg een opleiding aan de Universiteit van Amsterdam'))

вывод: Mijn naam xxx en ik volg een opleiding aan de xxx xxx

Результат, который я хочу: Mijn naam is Kim en ik volg een opleiding aan de Universiteit van Amsterdam

Думаю, у меня есть начало. Но когда я хочу закончить переменное предложение, я немного застреваю, потому что здесь я хочу сказать, есть ли в строке совпадающие слова из списка. Школа не заменяет ее, а просто распечатывает обратно.

🤔 А знаете ли вы, что...
Синтаксис Python известен своей простотой и читаемостью.


64
1

Ответ:

Решено

Замените все безопасные слова версией в нижнем регистре, затем анонимизируйте, а затем восстановите безопасные слова в нижнем регистре в их исходную форму.

test_strings = ['Adam goes to Universiteit van Amsterdam', 'George goes to Washington College', 'Anthony Hopkins is a student at Johns Hopkins']
safe_words = ['Universiteit van Amsterdam', 'Johns Hopkins', 'Washington College']

def anonymize(sentence, safe_words):
    restore = {}

    for word in safe_words:
        sentence = sentence.replace(word, word.lower())

        restore[word.lower()] = word
    
    for word in sentence.split():
        if word[0].isupper():
            sentence = sentence.replace(word, word[0]+'.')
    
    for word, restored_word in restore.items():
        sentence = sentence.replace(word, restored_word)
    
    return sentence

for sentence in test_strings:
    print(anonymize(sentence, safe_words))

Выход:

A. goes to Universiteit van Amsterdam
G. goes to Washington College
A. H. is a student at Johns Hopkins