Python: как действовать на соответствие строки - PullRequest
4 голосов
/ 25 января 2012

Следующее

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

Ответы [ 2 ]

5 голосов
/ 25 января 2012

Второй аргумент re.sub() также может быть вызываемым, что позволяет вам:

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

Кстати, на самом деле нет смысла использовать float вместо int, поскольку ваше регулярное выражение не включает точки и всегда будет неотрицательным целым числом

4 голосов
/ 25 января 2012

Хитрость заключается в предоставлении функции в качестве аргумента 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, так что это то, что я использовал.

...