以下
>>> 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
也不做eval
or exec
。
to 的第二个参数re.sub()
也可以是可调用的,它可以让您执行以下操作:
re.sub(r'(\d+)', lambda match:'%d' % (int(match.group(1))*2), 'test line 123')
顺便说一句,确实没有理由在 int 上使用浮点数,因为您的正则表达式不包含句点,并且始终是非负整数
诀窍是提供一个函数作为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
,所以这就是我使用的。