4

以下

>>> 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

也不做evalor exec

4

2 回答 2

5

to 的第二个参数re.sub()也可以是可调用的,它可以让您执行以下操作:

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

顺便说一句,确实没有理由在 int 上使用浮点数,因为您的正则表达式不包含句点,并且始终是非负整数

于 2012-01-25T13:47:37.137 回答
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,所以这就是我使用的。

于 2012-01-25T13:46:44.220 回答