Как преодолеть проблему с настройками флага regex (Python)? - PullRequest
1 голос
/ 28 марта 2019

Я использую следующий код для множественных замен слов в строке:

pattern = re.compile(r'\b(' + '|'.join(re.escape(key) for key in abbreviationsDict().keys()) + r')\W', flags=re.I)
        s = pattern.sub(lambda x: abbreviationsDict()[x.group(1)] + ' ', s)

Функция со словарем:

def abbreviationsDict():
    return {'ref.': 'reference', 'ref:': 'reference', 'approx.': 'approximately', 'no.': '', 'nos.': ''}

А для предложения s = "Variation of Condition on planning application Ref: CB/15/03633/FULL dated 30/11/2015: Condition 9" я получаю ошибку:

   s = pattern.sub(lambda x: abbreviationsDict()[x.group(1)] + ' ', s)

KeyError: 'Ref:'

Это работает, когда я строчную s переменную, но я получаю строчные результаты.Что я делаю не так с этим флагом, чтобы он не работал должным образом?

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Поскольку ключи в словаре строчные, вы должны перевести совпадения в нижний регистр:

s = pattern.sub(lambda x: abbreviationsDict()[x.group(1).lower()] + ' ', s)
                                                        ^^^^^^^^ 

См. Демоверсию Python :

import re
def abbreviationsDict():
    return {'ref.': 'reference', 'ref:': 'reference', 'approx.': 'approximately', 'no.': '', 'nos.': ''}
pattern = re.compile(r'\b({})(?!\w)'.format('|'.join(re.escape(key) for key in abbreviationsDict().keys())), flags=re.I)
s = "Variation of Condition on planning application Ref: CB/15/03633/FULL dated 30/11/2015: Condition 9"
s = pattern.sub(lambda x: abbreviationsDict()[x.group(1).lower()], s)
print(s)
# => Variation of Condition on planning application reference CB/15/03633/FULL dated 30/11/2015: Condition 9

Обратите внимание, что \W в конце вашего паттерна поглотил любой несловарный символ, и вы заменили его пробелом. Я предлагаю превратить \W в (?!\w) однозначную конечную границу слова и отказаться от добавления " " в лямбда-выражении.

0 голосов
/ 28 марта 2019

Хотя вы можете использовать re.I, чтобы сделать регистр нечувствительным к регистру, совпадения вашего регулярного выражения возвращаются с исходным регистром.Таким образом, вам нужно будет изменить

abbreviationsDict()[x.group(1)]

на

abbreviationsDict()[x.group(1).lower()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...