2012-01-25 25 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