Форум сайта python.su
857
alexeyvanzhulaты не знаешь, что ты хочешь, поэтому ты не знаешь, что нужно сделать
Имя file может быть любое и не обязательно с номером и необязательно с расширением.
Так что кусок кода явно должен быть побольше. Какие варианты можете предложить? - скорость выполнения критична.
alexeyvanzhulaздесь, к примеру, никакого инкрементирования нет, потому что номера изначально нет, и происходит вставка
имеется ввиду, например, вызов функции с именем file.ext и возврат file1.ext
alexeyvanzhula
Есть строка вида file_01.ext. Нада инкрементально увеличивать\уменьшать номер.
>>> import re >>> >>> def f(s, op, n): ... # дано : строка s, в которой есть число, ... # операция op (1 - плюс, -1 - минус) и число n ... # получить: ответ = строка s, в которой к числу прибавлено ... # число n или отнято (в зависимости от op) ... assert op in (1, -1) ... def t(mo): ... # дано : объект-совпадение mo с двумя группами ... # получить: в первой группе число увеличено или уменьшено на n ... # (ширина числа не меньше исходной) ... num, end = mo.groups() ... nlen = len(num) ... newnum = int(num) + op * n ... return '{0:0{w}}{1}'.format(newnum, end, w=nlen) ... return re.sub(r'(\d+)(\D*)$', t, s) ... >>> f('file_01.ext', 1, 5) 'file_06.ext' >>> f('file_01.ext', -1, 5) 'file_-4.ext' >>> f('00001234', 1, 100) '00001334' >>> f('00001234', -1, 100) '00001134' >>>
Отредактировано py.user.next (Фев. 14, 2013 02:04:23)
Офлайн
0
py.user.next
Офлайн
0
py.user.next Ваша функция не во всех случаях работает правильно. Я вот привел список изменений. В нем описаны всевозможные варианты:
file = file1
file.ext = file1.ext
file1 = file2
file1.ext = file2.ext
file1.ext1 = file2.ext1
file12abc1.ext = file12abc2.ext
Отредактировано alexeyvanzhula (Фев. 14, 2013 11:55:44)
Офлайн
857
file12abc000123.ext -> ?
Офлайн
0
py.user.next
file12abc000123.ext -> ?
Офлайн
import re import os def new_name(name, i=1): f, e = os.path.splitext(name) def m(n): a, b = n.groups() if b: b = str(int(b) + i) else: b = '1' return '%s%s%s' % (a, b, e) return re.sub('^(.*?)(\d*)$', m, f) print new_name('26aj2a32') print new_name('26aj2a32.abc') print new_name('26aj') print new_name('32', -1)
Офлайн
0
dimy44Спасибо. Данный вариант работает во всех случаях.
Офлайн
857
>>> new_name('file00001.txt', 3) 'file4.txt' >>> new_name('file00001.txt', -3) 'file-2.txt' >>> >>> new_name('file12abc000123.ext') 'file12abc124.ext' >>>
Офлайн
857
alexeyvanzhula
Как можно изменить вашу функцию чтобы это учитывалось.
>>> import re >>> import os >>> >>> def f(s, op, n): ... # дано : строка s, операция op (1 - плюс, -1 - минус) ... # и число n ... # получить: ответ = строка s, в которой к числу (если нет - к нулю) ... # прибавлено число n или отнято (в зависимости от op) ... assert op == -1 or op == 1 ... def t(mo): ... # дано : объект-совпадение mo с двумя группами, ... # в первой группе - число ... # получить: ответ = строка из этих групп, в первой группе ... # число увеличено или уменьшено на n ... # (ширина числа не меньше исходной, и оно >= 0) ... assert mo.group(1).isdigit() ... num, end = mo.groups() ... nlen = len(num) ... newnum = int(num) + op * n ... if newnum < 0: ... newnum = 0 ... return '{0:0{w}}{1}'.format(newnum, end, w=nlen) ... name, ext = os.path.splitext(s) ... if not set(name) & set('0123456789'): ... name += '0' ... return re.sub(r'(\d+)(\D*)$', t, name) + ext ... >>> f('file_01.ext', 1, 5) 'file_06.ext' >>> f('file_01.ext', -1, 5) 'file_00.ext' >>> f('00001234', 1, 100) '00001334' >>> f('00001234', -1, 100) '00001134' >>> f('file12abc000123.ext', 1, 1) 'file12abc000124.ext' >>> >>> f('file_0.ext', 1, 1) 'file_1.ext' >>> f('file.ext', 1, 1) 'file1.ext' >>> f('file.ext', -1, 5) 'file0.ext' >>> >>> f('file.ext', 1, 0) 'file0.ext' >>>
Отредактировано py.user.next (Фев. 15, 2013 05:18:31)
Офлайн
Точно. “Слона то я и не заметил”
Офлайн