Передача функции re.sub в Python

У меня есть строки, которые содержат число где-то в них, и я пытаюсь заменить это число на их текстовую нотацию (т.е. 3 → три). У меня есть функция, которая делает это. Теперь проблема заключается в нахождении номера внутри строки, сохраняя остальную часть строки неповрежденной. Для этого я решил использовать функцию re.sub, которая может принять "вызываемый". Однако переданный ему объект является внутренним _sre.SRE_Match, и я не уверен, как его обрабатывать. Моя функция принимает число или строковое представление.

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

Ответ 1

Вы можете вызвать group(), чтобы получить соответствующую строку:

import re

number_mapping = {'1': 'one',
                  '2': 'two',
                  '3': 'three'}
s = "1 testing 2 3"

print re.sub(r'\d', lambda x: number_mapping[x.group()], s)

печатает:

one testing two three

Ответ 2

Чтобы ваша функция соответствовала re.sub, вы можете обернуть ее с помощью лямбда:

re.sub('pattern', lambda m: myfunction(m.group()), 'text')