Изменение номера версии на Python из одной цифры - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть номер версии в файле, подобном этому:

Тестирование xxxx

Так что я получаю его так:

import re

def increment(match):
    # convert the four matches to integers
    a,b,c,d = [int(x) for x in match.groups()]
    # return the replacement string
    return f'{a}.{b}.{c}.{d}'

lines = open('file.txt', 'r').readlines()
lines[3] = re.sub(r"\b(\d+)\.(\d+)\.(\d+)\.(\d+)\b", increment, lines[3])

Я хочу сделать так, чтобы последняя цифра была 9 ..., затем измените ее на 0, а затем измените предыдущую цифру на 1. Так что 1.1.1.9 изменится на 1.1.2.0.

Я сделал это, выполнив:

def increment(match):
    # convert the four matches to integers
    a,b,c,d = [int(x) for x in match.groups()]
    # return the replacement string
    if (d == 9):
        return f'{a}.{b}.{c+1}.{0}'
    elif (c == 9):
        return f'{a}.{b+1}.{0}.{0}'
    elif (b == 9):
        return f'{a+1}.{0}.{0}.{0}'

Проблема возникает, когда его 1.1.9.9 или 1.9.9.9.Где несколько цифр надо округлить.Как я могу решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Если ваши версии никогда не превысят 10, лучше просто преобразовать их в целое число, увеличить его, а затем преобразовать обратно в строку.Это позволяет вам использовать столько номеров версий, сколько вам нужно, и вы не ограничены тысячами.

def increment(match):
    match = match.replace('.', '')
    match = int(match)
    match += 1
    match = str(match)
    output = '.'.join(match)
    return output
0 голосов
/ 28 декабря 2018

Добавить 1 к последнему элементу.Если оно больше 9, установите его на 0 и сделайте то же самое для предыдущего элемента.Повторите при необходимости:

import re

def increment(match):
    # convert the four matches to integers
    g = [int(x) for x in match.groups()]
    # increment, last one first
    pos = len(g)-1
    g[pos] += 1
    while pos > 0:
        if g[pos] > 9:
            g[pos] = 0
            pos -= 1
            g[pos] += 1
        else:
            break
    # return the replacement string
    return '.'.join(str(x) for x in g)

print (re.sub(r"\b(\d+)\.(\d+)\.(\d+)\.(\d+)\b", increment, '1.8.9.9'))
print (re.sub(r"\b(\d+)\.(\d+)\.(\d+)\.(\d+)\b", increment, '1.9.9.9'))
print (re.sub(r"\b(\d+)\.(\d+)\.(\d+)\.(\d+)\b", increment, '9.9.9.9'))

Результат:

1.9.0.0
2.0.0.0
10.0.0.0
0 голосов
/ 28 декабря 2018

Использовать целочисленное сложение?

def increment(match):
    # convert the four matches to integers
    a,b,c,d = [int(x) for x in match.groups()]

    *a,b,c,d = [int(x) for x in str(a*1000 + b*100 + c*10 + d + 1)]
    a = ''.join(map(str,a)) # fix for 2 digit 'a'
    # return the replacement string
    return f'{a}.{b}.{c}.{d}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...