Подтвердить что ты не робот

Функции вызова из re.sub

Это простой пример:

import re

math='<m>3+5</m>'
print re.sub(r'<(.)>(\d+?)\+(\d+?)</\1>', int(r'\2') + int(r'\3'), math)

Это дает мне эту ошибку:

ValueError: invalid literal for int() with base 10: '\\2'

Он отправляет \\2 вместо 3 и 5.

Почему? Как его решить?

4b9b3361

Ответ 1

Если вы хотите использовать функцию с re.sub, вам нужно передать функцию, а не выражение. Как описано в здесь, ваша функция должна взять объект соответствия в качестве аргумента и возвращает заменяющую строку. Вы можете получить доступ к группам с помощью обычных методов .group(n) и так далее. Пример:

re.sub("(a+)(b+)", lambda match: "{0} as and {1} bs ".format(
    len(match.group(1)), len(match.group(2))
), "aaabbaabbbaaaabb")
# Output is '3 as and 2 bs 2 as and 3 bs 4 as and 2 bs '

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

Ответ 2

Вам нужно использовать функцию лямбда.

print re.sub(r'<(.)>(\d+?)\+(\d+?)</\1>', lambda m: str(int(m.group(2)) + int(m.group(3))), math)