Как заменить совпадение функцией в выражении регулярного выражения в Python - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь лучше понять, как работают функции лямбда-выражения и регулярные выражения в 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" и использовать имя функции, не вызывая ее на самом деле.

Я не могу понять, почему совпадение, возвращаемое выражением регулярного выражения, правильно передается функции, если она вызывается без аргументов, и не передается первому аргументу при вызове с обычным синтаксисом.

1 Ответ

0 голосов
/ 07 мая 2019

Я не могу понять, почему совпадение, возвращаемое выражением регулярного выражения, правильно передается функции, если она вызывается без аргументов

Это не то, что происходит. pattern.sub(replace_conditions, line) не вызывает функцию replace_conditions, она просто передает ее.

С документы для:

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

, что совпадает с:

pattern.sub(repl, string)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...