2015-02-12 3 views
0

Что я подался работать с re модуля Python является то, что вы всегда создают match объект при работе с re функцийнеявной или неопределенный объект матч

Может кто-то пожалуйста, объясните, почему и как этот кусок кода работает? Я не могу пройти через это.

import re 

text = "1 < than 2 > 0 & not 'NULL'" 

html_escapes = {'&': '&amp;', 
       '<': '&lt;', 
       '>': '&gt;', 
       '"': '&quot;', 
       '\'': '&apos;'} 


def multiwordreplace(txt, worddict): 
    rc = re.compile('|'.join(map(re.escape, worddict))) 
    def translate(match): 
     return worddict[match.group(0)] 
    return rc.sub(translate, txt) 

print multiwordreplace(text, html_escapes) 

Где этот match объект?

+0

Что вы имеете в виду «* приходит от? *» –

+0

Что я имею в виду, кто или что создает объект 'match' и передает его на' translate'. Для меня это похоже на то, что оно создается «на лету». – daniel402

ответ

3
x = re.compile(a) 
x.sub(b, c) 

эквивалентно

re.sub(a, b, c) 

т.е. скомпилированный регулярное выражение a является pattern, b является замена repl и c является string.

В этом случае repl является функцией , translate. Из the docs:

Если РЕПЛ функция, она вызывается для каждого Неперекрывающиеся появления рисунка. Функция принимает один аргумент объекта сопоставления и возвращает заменяющую строку.

Параметр match поставляется re.sub для каждого матча в string, и функция возвращает соответствующую замену из worddict подставить в txt.

Вы также можете написать это как:

return rc.sub(lambda match: worddict[match.group(0)], txt) 
+0

спасибо, очень хорошо объяснил. – daniel402

0

Я предполагаю, что вы имеете в виду, где match в:

def translate(match): 
    return worddict[match.group(0)] 

происходит от. Python поддерживает концепцию функционального программирования, где можно передать функцию в качестве аргумента.

Если вы, таким образом, называют re.sub как:

rc.sub(translate, txt) 

translate является функцией. И то, что делает rc.sub, ищет спички. Каждое совпадение, вызывает функцию сгенерированным аргументом. Результатом является замена этой функции.

Другим примером является map функция:

def map(f, lst): 
    result = [] 
    for x in lst: 
     result.append(f(x)) 
    return result 

Так что происходит, вы называете mapс функциейf. Затем вы перебираете по lst и для каждого элемента x, вы звонитеf с x. Результат добавляется к списку.

Таким образом, вам не нужно передавать translate с аргументом для получения значения, вы можете передать функцию, чтобы другая функция могла вызвать эту функцию с несколькими (разными) значениями.