Вызов функций из 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
,
Зачем? Как мне это решить?
2 ответа
Решение
Если вы хотите использовать функцию с 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 '
Обратите внимание, что функция должна возвращать строки (так как они будут возвращены в исходную строку).
Вам нужно использовать лямбда-функцию.
print re.sub(r'<(.)>(\d+?)\+(\d+?)</\1>', lambda m: str(int(m.group(2)) + int(m.group(3))), math)