检查字符串是否包含python中的数字/数字/数字

时间:2013-08-07 07:20:27

标签: python string digit

我有一个字符串,我需要检查它是否包含number/digit at the end字符串,并且需要在字符串末尾用number/digit增加+1

我将获得如下字符串

string2  = suppose_name_1
string3  = suppose_name_22
string4  = supp22ose45_na56me_45

我肯定会得到上述格式的字符串,如suppose_somthing + Underscore + digits

所以从上面的字符串

  1. 我需要检查字符串是否在下划线
  2. 之后的字符串末尾包含数字/数字
  3. 如果包含,则需要使用+1增加

    string2 = suppose_name_ 2

    string3 = suppose_name_ 23

    string4 = supp22ose45_na56me_ 46

  4. 我们如何通过使用正则表达式或其他东西在python中执行此操作,但这应该非常快。

    我做过像here这样的事情,但想要用非常快的方式实现,所以接近SO

    Edit: 抱歉,上面没有提到

    有时它只包含something_name而没有整数,因此我需要检查它是否首先包含一个数字

3 个答案:

答案 0 :(得分:2)

如何使用正则表达式:

import re

def process_string(s):
    try:
        part1, part2 = re.search('^(.*_)(\d+)$', s).groups()
        part2 = str(int(part2) + 1)
        return part1 + part2 
    except AttributeError:
        return s

print process_string("suppose_name_1")
print process_string("suppose_name_22")
print process_string("supp22ose45_na56me_45")

print process_string("suppose_name")

打印:

suppose_name_2
suppose_name_23
supp22ose45_na56me_46
suppose_name

仅供参考,使用正则表达式没有任何错误或可怕。

答案 1 :(得分:1)

您不需要正则表达式。您可以使用简单的str.replace

>>> s = 'suppose_name_1'
>>> index = s.rfind('_')  # Last index of '_'
>>> s.replace(s[index+1:], str(int(s[index+1:]) + 1))
'suppose_name_2'

如果您需要先检查最后是否有数字,可以使用str.isdigit()方法检查:

>>> s = 'suppose_name'
>>> 
>>> index = s.rfind('_')
>>> if s[index+1:].isdigit():
        s = s.replace(s[index+1:], str(int(s[index+1:]) + 1))


>>> s
'suppose_name'

答案 2 :(得分:1)

这是一个简短的正则表达式解决方案,它使用re.sub(...)增加数字:

from re import sub

string2  = 'suppose_name_1'
string3  = 'suppose_name_22'
string4  = 'supp22ose45_na56me_45'
print [sub(r'^(?P<pretext>.*_)(?P<number>\d+)$', lambda x : '%s%d' % (x.group('pretext'), int(x.group('number')) + 1), s) for s in (string2, string3, string4)]

和输出:

['suppose_name_2', 'suppose_name_23', 'supp22ose45_na56me_46']

更容易阅读的版本将是这样的:

from re import sub

string2  = 'suppose_name_1'
string3  = 'suppose_name_22'
string4  = 'supp22ose45_na56me_45'
regex = r'^(?P<pretext>.*_)(?P<number>\d+)$'

def increment(matchObject):
    return '%s%d' % (matchObject.group('pretext'), int(matchObject.group('number')) + 1)

for s in (string2, string3, string4):
    print sub(regex, increment, s)

和输出:

suppose_name_2
suppose_name_23
supp22ose45_na56me_46