2015-01-25 10 views
3

Скажем, у меня есть строки вроде следующего:Как применить функцию по обратной ссылке?

old_string = "I love the number 3 so much" 

Я хотел бы обнаружить целые числа (в приведенном выше примере, Существует только один номер, 3), и заменить их на значение большее 1, т.е. желаемый результат должен быть

new_string = "I love the number 4 so much" 

в Python, я могу использовать:

r = re.compile(r'([0-9])+') 
new_string = r.sub(r'\19', s) 

для добавления 9 на ан d целочисленных чисел. Однако я хотел бы применить что-то более общее на \1.

Если я определить функцию:

def f(i): 
    return i + 1 

Как применять f() на \1, так что я могу заменить совпавшие строки в old_string с чем-то вроде f(\1)?

ответ

8

В дополнение к наличию заменить строку, re.sub позволяет использовать функцию, чтобы сделать замену:

>>> import re 
>>> old_string = "I love the number 3 so much" 
>>> def f(match): 
...  return str(int(match.group(1)) + 1) 
... 
>>> re.sub('([0-9])+', f, old_string) 
'I love the number 4 so much' 
>>> 

Из docs:

re.sub(pattern, repl, string, count=0, flags=0)

Если repl является функции, он вызывается для каждого неперекрывающегося вхождения pattern. Функция принимает один аргумент аргумента и возвращает строку замены.

+0

просто избили меня к нему +1 –

+0

Спасибо. Оно работает. –