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