@leham1

Поможете с «cb = lambda m: random.choice(m.group(1).split('|'))»?

Здравствуйте.
Нашел код в интернете, который генерирует уникальный текст.
def rand_text(s):
    import re, random
    
    rgx = re.compile('\{([^{}]*)\}')
    cb = lambda m: random.choice(m.group(1).split('|'))
    
    while 1:
        r = rgx.sub(cb, s)
        
        if len(r) == len(s):
            return r
        
        s = r
 
if __name__ == '__main__':
    print(rand_text(u'{Привет|Ку}, %username%. Как {дел{а|ишки}|сам|жизнь|поживает твоя мамаша}?'))


Он отлично работает. Но я его хочу немного улучшить, под свои нужды.
Беда в том, что я не могу понять, как работает это
cb = lambda m: random.choice(m.group(1).split('|'))


Аргумент "m" нигде же не передается.

Помогите пожалуйста кто может понять это)
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Передаётся вот здесь:
rgx.sub(cb, s)
Все сопоставления регекспу будут подаваться этой функции в аргумент.
cb = lambda m: \     # Это лямбда-функция с одним аргументом по имени m
    random.choice(   # результат функции вычисляется методом случайного выбора из
        m.group(1)   # текста (сопоставленного с первой скобкой регекспа)
        .split('|')  #  разбитого по символу "|"
    )

Регексп rgx = re.compile('\{([^{}]*)\}') находит куски текста в фигурных скобках и m.group(1) будет соответствовать этому куску при каждом вызове лямбды.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы