используйте словарь для замены слова на регулярное выражение в python - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь написать немного кода, который будет использовать регулярное выражение для расширения аббревиатур в текстовом файле до полных слов, но не заменит все экземпляры текста аббревиатуры.

Я не могу понять, что происходит в части шаблона функции подстановки, где я поместил '***' ниже. Я могу заставить код работать, жестко закодировав аббревиатуру для замены, но я хочу передать ключ в словарь, чтобы одна функция могла перебирать словарь, и в будущем мне нужно только обновить словарь. Кто-нибудь может уточнить это для меня?

import re

sample = 'premedicate with 0.3 mg/kg goofballs and 1.2 mg/kg happy dust with test string bmge or bmg or mgb'

fr_dict = {'kg': 'kilogram', 'mg': 'miligram', '/': ' per '}

for key in fr_dict:
    sample = re.sub(rf'{{***}}', lambda m: str(fr_dict[m.group(0)]), sample)

Ответы [ 2 ]

2 голосов
/ 15 марта 2020

Вы можете выполнять итерацию по словарю, заменяя ключ, найденный в строке, значением:

import re

sample = 'premedicate with 0.3 mg/kg goofballs and 1.2 mg/kg happy dust with test string bmge or bmg or mgb'

fr_dict = {'kg': 'kilogram', 'mg': 'miligram', '/': ' per '}

for key, value in fr_dict.items():
    sample = re.sub(rf'\b{key}\b', value, sample)

print(sample)
# premedicate with 0.3 miligram per kilogram goofballs and 1.2 miligram per kilogram happy dust with test string bmge or bmg or mgb

Обратите внимание, что граница слова помогает нам заменить только полные слова, которые соответствуют.

1 голос
/ 15 марта 2020

Это кажется немного проще, чем вы думаете. Если вы используете .items() для замены, у вас есть доступ и к ключу, и к значению замены в вашем l oop.

Другой способ сделать это - объединить ключи в чередование и заменить, используя лямбда для поиска правильной пары подкачки:

pattern = "|".join(rf"\b{x}\b" for x in swaps.keys())
re.sub(pattern, lambda x: swaps[x.group()], sample)

Использование:

>>> import re
>>> sample = 'premedicate with 0.3 mg/kg goofballs and 1.2 mg/kg happy dust with test string bmge or bmg or mgb'
>>> swaps = {'kg': 'kilogram', 'mg': 'miligram', '/': ' per '}
>>> pattern = "|".join(rf"\b{x}\b" for x in swaps.keys())
>>> re.sub(pattern, lambda x: swaps[x.group()], sample)
'premedicate with 0.3 miligram per kilogram goofballs and 1.2 miligram per kilogram happy dust with test string bmge or bmg or mgb'
...