2012-01-25 23 views
4

以下的Python:如何采取行动重新的匹配字符串

>>> re.sub(r'(\d+)', r'\1' * 2, 'test line 123') 

'test line 123123' 

是有办法让它给

'test line 246' 

float()强制不起作用:

>>> re.sub(r'(\d+)', float(r'\1') * 2, 'test line 123') 
could not convert string to float: \1 

也不evalexec

回答

5

的第二个参数re.sub()也可以是可调用的,它可以让你做的事:

re.sub(r'(\d+)', lambda match:'%d' % (int(match.group(1))*2), 'test line 123') 

BTW,实在是没有理由使用浮动过整型,因为你的正则表达式不包括期间,总是会是一个非负整数

4

诀窍是提供一个函数作为repl参数re.sub()

In [7]: re.sub(r'(\d+)', lambda m:'%.0f'%(float(m.group(1))*2), 'test line 123') 
Out[7]: 'test line 246' 

每个匹配转换为float,一倍,然后使用适当的格式转换成字符串。

这可以简化,如果数字是整数一点点,但你的问题特别提到float,所以这是我用过的东西。

+0

I'd've标记您既作为公认的答案。 – Adobe