Я пытаюсь лучше понять, как работают функции лямбда-выражения и регулярные выражения в Python. Для этого я заменяю лямбду на именованную функцию.
Несмотря на то, что я нашел способ заставить его работать, я не могу понять, почему это работает.
Лямбда / регулярное выражение, над которым я работаю, упоминается в следующих постах:
Как заменить несколько подстрок строки?
Python - заменить совпадение регулярного выражения на соответствующее значение пары
Это основной кусок кода:
import re
# define desired replacements here
rep = {"condition1": "", "condition2": "text"}
text = "(condition1) and --condition2--"
# use these three lines to do the replacement
rep = dict((re.escape(k), v) for k, v in rep.items())
pattern = re.compile("|".join(rep.keys()))
output = pattern.sub(lambda m: rep[re.escape(m.group(0))], text)
print(output)
>>> '() and --text--'
Если я заменю лямбда-функцию на:
def replace_conditions(match, rep):
return rep[re.escape(match.group(0))]
output = pattern.sub(replace_conditions(m, rep), text)
Я получаю следующее исключение:
NameError: name 'm' is not defined
И я могу заставить его работать только используя этот синтаксис:
def replace_conditions(match, rep=rep):
return rep[re.escape(match.group(0))]
output = pattern.sub(replace_conditions, line)
ПРИМЕЧАНИЕ. Мне пришлось предварительно присвоить значение второму аргументу "rep" и использовать имя функции, не вызывая ее на самом деле.
Я не могу понять, почему совпадение, возвращаемое выражением регулярного выражения, правильно передается функции, если она вызывается без аргументов, и не передается первому аргументу при вызове с обычным синтаксисом.