vic57
можно проще:
>>> def f(s):
... tmp = ''
... out = ''
... for i in s:
... tmp += i
... if i == '{' :
... out += tmp
... tmp = ''
... elif i == '}':
... try : out += str(int(tmp[:-1]) - 1 ) + '}'
... except: out += tmp
... tmp = ''
... out += tmp
... return out
...
>>> s = '{9}:{10}:http:{6}:{7}:{4}:{5}::10.05:текст:{11}@{12}:{13}'
>>>
>>> print s
{9}:{10}:http:{6}:{7}:{4}:{5}::10.05:текст:{11}@{12}:{13}
>>> print f(s)
{8}:{9}:http:{5}:{6}:{3}:{4}::10.05:текст:{10}@{11}:{12}
>>>
>>> print f('{abc')
{
>>>
Тут портит строку, если закрывающей скобки нет.
for_soul
На просторах интернета так и не нашел внятного пояснения метода group()
Не могли бы вкратце объяснить?
re.sub() когда находит совпадение, это совпадение представляет из себя объект, в котором хранится вся информация о совпадении (где оно в строке находится, какая подстрока совпала, какие там группы есть). Вот этот объект потом пытается замениться. Если ему предлагают замениться на строку, то он просто отбрасывается и вместо него вставляется строка. А если ему предлагают замениться по функции, то эта функция считается такого вида “принимает объект совпадения и возвращает какую-то строку”, потом исходный объект совпадения отбрасывается и вместо него вставляется эта возвращённая из функции строка.
Так вот, чтобы функцию не делать зависящей от объекта совпадения (может она нам понадобится в других задачах, где нет регулярных выражений вообще), мы делаем обёртку - маленькую функцию, которая просто берёт из объекта совпадения совпавшую строку и уже эту строку подаёт в какую-то функцию преобразования строки (трансляции строки, почему и tr). Поэтому мы функцию преобразования строки можем использовать в любой другой задаче, она никак не связана с регулярными выражениями, она просто преобразует (транслирует) строку в строку.
lambda mo: tr(mo.group())
lambda - это выражение для создания анонимной функции (функции без имени).
mo - это аргумент этой анонимной функции, мы его назвали mo потому, что он обозначает match object (объект совпадения).
tr() - это вызов нашей функции трансляции строки, она принимает строку “{10}” и возвращает строку “{9}” (ну, это частный случай, а вообще “{N}” -> “{N-1}”, так будет правильнее записать).
mo.group() - это вызов у объекта совпадения метода group() для получения всей строки, с которой совпало регулярное выражение. Метод group() у объекта совпадения может брать любые группы, которые совпали (типа mo.group(1, 2)), а просто group() равно group(0), где нулевая группа - это вся строка, которая совпала с регулярным выражением.
И когда анонимная функция запустилась, она достаёт строку у объекта совпадения и вызывает функцию трансляции, передавая в неё эту строку; затем функция трансляции её транслирует в новую строку и новая строка возвращается из анонимной функции и передаётся функции re.sub() для замены; и та её берёт и вставляет вместо совпадения.
А это пример, как выглядит работа с группами в объекте совпадения
>>> import re
>>>
>>> mo = re.search(r'(a)(b)(c)', 'abcdef')
>>> mo.group(0)
'abc'
>>> mo.group()
'abc'
>>> mo.group(1)
'a'
>>> mo.group(2)
'b'
>>> mo.group(3)
'c'
>>> mo.group(1, 2, 3)
('a', 'b', 'c')
>>> mo.group(1, 2, 3, 1, 2, 3)
('a', 'b', 'c', 'a', 'b', 'c')
>>>
>>> mo.groups()
('a', 'b', 'c')
>>>
>>> mo
<_sre.SRE_Match object at 0xb73e5660>
>>>
Дальше будешь читать
python.org. re.sub и
python.org. match object