【问题标题】:Incrementing the last digit in a Python string递增 Python 字符串中的最后一位数字
【发布时间】:2014-05-23 04:17:10
【问题描述】:

我想在 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)       

我可以将所有数字与 re.findall 匹配,然后增加列表中的最后一个数字,但我不确定如何替换:

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

【问题讨论】:

  • number.replace(number[-1],str(int(number[-1])+1))怎么样
  • \d$ 将匹配字符串末尾的数字。
  • Barmar:由于我正在处理主机名,因此该数字通常不会位于字符串的末尾。我只想要列表中的最后一个。 sshashank:我会试试的,谢谢。
  • 所以host009 应该变成...?
  • @JoachimIsaksson 好点,我已经更新了答案 - 可能对 OP 有所帮助。

标签: regex python-2.7


【解决方案1】:

使用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'

您可能还想以特殊方式处理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'

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'

【讨论】:

  • 如果有两组数字,这将增加它们。抱歉,如果我的问题不清楚,但我希望能够处理诸如 foo1.bar-2.domain.com 之类的名称并增加 2。如果有一组数字,我不必限制替换到最后一位,所以 f.bar-29.domain.com 可以变成 foo.bar-30.domain.com。感谢您提供有关负面展望的提示,这非常有帮助。
  • @Merch 好,检查 UPD 部分 - 我稍微修改了正则表达式来处理这种情况。
  • @alecxe 对于您的 UPD,如果您只想增加最后一个数字,则需要 (\d+)(?!.*\d),如 stackoverflow.com/a/5320864/3571110 中所示。您的正则表达式将增加找到的所有数字。因此 f.3bar-29.domain.com 将变为 f.4bar-30.domain.com 与 (\d+)(?!\d) 和 f.3bar-30.domain.com 与 (\d+)(?! .*\d)
  • @proximous 感谢分享完美满足我的需求。在不同的数字组长度(包括带有字母的长度)中仅碰撞最后一位数字,为我节省了很多麻烦。 ``` last_tag = 'v2.6.32.27' new_tag = re.sub(r"(\d+)(?!.*\d)", lambda x: str(int(x.group(0)) + 1 ), last_tag) ``` 结果:v2.6.32.28
猜你喜欢
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2017-04-30
  • 2015-06-18
  • 2015-05-03
  • 2022-11-16
相关资源
最近更新 更多