Найти - Пользователи
Полная версия: инкрементальное увеличение номера в сроке
Начало » Python для новичков » инкрементальное увеличение номера в сроке
1 2
py.user.next
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'
>>>
alexeyvanzhula
py.user.next

Я наверное не сильно правильно выразилься в плане инкрементальности.
Когда имя простое, типа file.ext - переводим его в имя с номером (file1.ext), а дальше уже пошло увеличение.

Спасибо за функцию.
alexeyvanzhula
py.user.next Ваша функция не во всех случаях работает правильно. Я вот привел список изменений. В нем описаны всевозможные варианты:

file = file1
file.ext = file1.ext
file1 = file2
file1.ext = file2.ext
file1.ext1 = file2.ext1
file12abc1.ext = file12abc2.ext


Как можно изменить вашу функцию чтобы это учитывалось. Повторюсь, я в регэкспах не шарю. Поэтому прошу вашей помощи.
py.user.next
file12abc000123.ext -> ?
я понял, что нужно определять наличие расширения (лексический анализ проводить)
уточни вариант
alexeyvanzhula
py.user.next
file12abc000123.ext -> ?

file12abc000123.ext -> file12abc000124.ext
dimy44
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)
alexeyvanzhula
dimy44
Спасибо. Данный вариант работает во всех случаях.
py.user.next
>>> new_name('file00001.txt', 3)
'file4.txt'
>>> new_name('file00001.txt', -3)
'file-2.txt'
>>>
>>> new_name('file12abc000123.ext')
'file12abc124.ext'
>>>
py.user.next
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'
>>>
dimy44
Точно. “Слона то я и не заметил”
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB