2015-07-08 2 views
1

Может кто-нибудь объяснить мне, почему я получаю другой результат, когда удаляю строки, содержащие «# дубликат»?Не понимаю меня странное поведение re

import re  

def nysiis(term: str) -> str: 
    """ 
    returns New York State Identification and Intelligence Algorithm (NYSIIS) code for given term 
    """ 

    if not len(term): 
     return '' 
    else: 
     term = term.upper() 

    table = { 
     r'\W+': '', # remove whitespace and non-word characters 

     r'^MAC': 'MCC', 
     r'^KN': 'NN', 
     r'K': 'C', 
     r'PH|PF': 'FF', 
     r'SCH': 'SSS', 

     r'(EE|IE)$': 'Y', 
     r'(DT|ND|NT|RD|RT)$': 'D', 

     # From now on first letter must no longer change. 
     r'(?<!^)EV': 'AF', 
     r'(?<!^)[AEIOU]': 'A', 
     r'(?<!^)Q': 'G', 
     r'(?<!^)Z': 'S', 
     r'(?<!^)(?:M|KN)': 'N', 

     r'(?<!^)([^AEIOUY])H': r'\1', 
     r'(?<!^)(.)H[^AEIOUY]': r'\1', 
     r'(?<!^)([AEIOUY])W': r'\1', 

     r'AY$': r'Y', 
     r'S$': r'', 

     r'(\w)\1+': r'\1', # original 
     r'A+$': r'' # original 
    } 

    for k, v in table.items(): 
     term = re.sub(k, v, term) 

    table = { # duplicate 
     r'(\w)\1+': r'\1', # duplicate 
     r'A+$': r'' # duplicate 
    } # duplicate 

    for k, v in table.items(): # duplicate 
     term = re.sub(k, v, term) # duplicate 

    return term 

if __name__ == '__main__': 
    names = [ 
     'Bishop', 'Carlson', 'Carr', 'Chapman', 'Franklin', 
     'Greene', 'Harper', 'Jacobs', 'Larson', 'Lawrence', 
     'Lawson', 'Louis, XVI', 'Lynch', 'Mackenzie', 'Matthews', 
     'McCormack', 'McDaniel', 'McDonald', 'Mclaughlin', 'Morrison', 
     "O'Banion", "O'Brien", 'Richards', 'Silva', 'Watkins', 
     'Wheeler', 'Willis', 'brown, sr', 'browne, III', 'browne, IV', 
     'knight', 'mitchell', "o'daniel", 
    ] 

    for name in names: 
     print('%15s: %s' % (name, nysiis(name))) 
+1

'г '\ W | \ s +': '', # удалить пробельные и не слово characters': пространства * являются символы * без слов, поэтому' г '\ W +': '' ' –

+0

Хорошо, спасибо, спасибо, но это, очевидно, не проблема здесь ... – marcus

ответ

2

Вы не хотите использовать Dict для подстановки:. Порядок итерации не совпадает с очередностью в списке их в случае, если вы измените dicts в список пар вместо этого, то работает так, как вы ожидаете.

table = [ 
    (r'\W+', ''), 
    #... 
] 

for k, v in table: 
    ... 
+0

Очевидно, что вы правы! –

+0

OMG, да ... Я нашел реализацию https://github.com/japerk/nltk-trainer/blob/master/nltk_trainer/featx/phonetics.py, это была моя отправная точка. И этот парень использовал словарь. Спасибо! – marcus

Смежные вопросы