增加Python字符串中的最后一位数字

Mer*_*rch 1 regex python-2.7

我想在Python 2.7中增加用户提供的字符串的最后一位数字.

我可以像这样替换第一个数字:

def increment_hostname(name):
    try:
        number = re.search(r'\d+', name).group() 
    except AttributeError:
        return False            
    number = int(number) + 1
    number = str(number)
    return re.sub(r'\d+', number, name)       
Run Code Online (Sandbox Code Playgroud)

我可以用re.findall匹配所有数字,然后递增列表中的最后一位数字,但我不知道如何进行替换:

number = re.findall(r'\d+', name)     
number = numbers[-1]
number = int(number) + 1                      
number = str(number)
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 7

使用negative look ahead地看到,有一个数字后没有数字,传递一个函数到re.sub()替代参数,并递增它的数字:

>>> import re
>>> s = "foo 123 bar"
>>> re.sub('\d(?!\d)', lambda x: str(int(x.group(0)) + 1), s)
'foo 124 bar'
Run Code Online (Sandbox Code Playgroud)

您可能还希望以9特殊方式处理,例如,将其替换为0:

>>> def repl(match):
...     digit = int(match.group(0))
...     return str(digit + 1 if digit != 9 else 0)
... 
>>> s = "foo 789 bar"
>>> re.sub('\d(?!\d)', repl, s)
'foo 780 bar'
Run Code Online (Sandbox Code Playgroud)

UPD(处理新示例):

>>> import re
>>> s = "f.bar-29.domain.com"
>>> re.sub('(\d+)(?!\d)', lambda x: str(int(x.group(0)) + 1), s)
'f.bar-30.domain.com'
Run Code Online (Sandbox Code Playgroud)

  • @alecxe 对于您的 UPD,如果您只想增加最后一个数字,则需要 (\d+)(?!.*\d),如 http://stackoverflow.com/a/5320864/3571110 中所示。您的正则表达式将增加找到的所有数字。因此,f.3bar-29.domain.com 将变为 f.4bar-30.domain.com(带有 (\d+)(?!\d))和 f.3bar-30.domain.com(带有(\d+)(?!) .*\d) (2认同)