Использование re.sub для замены числовой части строки арифметическими манипуляциями с этим числом в Python?

#python #regex #arithmetic-expressions #backreference

#python #регулярное выражение #арифметические выражения #обратная ссылка

Вопрос:

Допустим, у меня есть строка testing-1-6-180 — здесь я бы хотел записать вторую цифру (какой бы она ни была), здесь это «6», а затем я хочу добавить 5 к ее числовому значению (так 6), а затем вывести строку — так что в этом случае результат долженбыть testing-1-11-180 .

Это то, что я пробовал до сих пор:

 import re

mytext = "testing-1-6-180"
pat_a = re.compile(r'testing-1-(d )')
result = pat_a.sub( "testing-1-{}".format( int('1') 5 ), mytext )
  

… к сожалению, это не удается с:

 $ python3 test.py
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    result = pat_a.sub( "testing-1-{}".format( int('1') 5 ), mytext )
ValueError: invalid literal for int() with base 10: 'x01'
  

Итак, как я могу получить захваченную обратную ссылку, чтобы преобразовать ее в int, выполнить некоторую арифметику, а затем использовать результат для замены соответствующей подстроки?


Было бы неплохо иметь возможность опубликовать ответ, поскольку не совсем тривиально выяснить, как применить ответы там к этой проблеме здесь, но в любом случае никого это не волнует, поэтому я опубликую ответ как редактирование:

 import re

mytext = "testing-1-6-180"
pat_a = re.compile(r'testing-1-(d )')

def numrepl(matchobj):
  return "testing-1-{}".format( int(matchobj.group(1)) 5 )

result = pat_a.sub( numrepl, mytext )
print(result)
  

и результат таков testing-1-11-180 .

Комментарии:

1. Ваш вопрос вновь открыт; не стесняйтесь откатить ba5k для редактирования и опубликовать ответ вместо этого.

Ответ №1:

Вы можете использовать лямбда-выражение вместо:

 >>> mytext = "testing-1-6-180"
>>> s = re.sub(r'^(D*d D )(d )', lambda m: m.group(1)   str(int(m.group(2))   5), mytext)
>>> print (s)
'testing-1-11-180'