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

evalまたはしませんexec

4

2 に答える 2

5

の2番目の引数re.sub()も呼び出し可能にすることができます。これにより、次のことが可能になります。

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

ところで、正規表現にはピリオドが含まれておらず、常に非負の整数になるため、floatoverintを使用する理由は実際にはありません。

于 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、2倍にされてから、適切な形式を使用して文字列に変換されます。

数値が整数の場合、これは少し単純化できますが、あなたの質問は具体的に言及しているfloatので、それが私が使用したものです。

于 2012-01-25T13:46:44.220 に答える