处理组中的字符串后,替换所有出现的正则表达式组

时间:2014-05-21 18:43:13

标签: python regex

我有一个像这样的字符串:

text = '''this \sum 1,2 \end is three and \sum 2,3,4 \end is nine'''

我有一个在字符串中添加数字的函数

def add(numbers):
    return sum(map(lambda x:int(x), numbers.split(",")))

如何使用regexp通过'\\sum (.+?) \\end'函数传递组来替换add的所有实例? 即上面的字符串应为:

'''this 3 is three and 9 is nine'''

我可以使用"1,2"获取"2,3,4"findall并添加它们,但是如何将它们插回到它们应该去的文本中?也许是findallsplit的组合?在python中有更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

使用re.findall()代替re.sub(),并使用函数处理每个组。

该函数的返回值用作替换字符串:

re.sub(r'\\sum ([\d,]+) \\end', lambda m: str(add(m.group(1))), text)

lambda创建一个接受一个参数的函数,即匹配对象。它返回一个基于数字组的字符串,通过add()传递。

演示:

>>> import re
>>> text = '''this \sum 1,2 \end is three and \sum 2,3,4 \end is nine'''
>>> def add(numbers):
...     return sum(map(lambda x:int(x), numbers.split(",")))
... 
>>> re.sub(r'\\sum ([\d,]+) \\end', lambda m: str(add(m.group(1))), text)
'this 3 is three and 9 is nine'