我有一个字符串,我需要检查它是否包含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
增加
string2 = suppose_name_ 2
string3 = suppose_name_ 23
string4 = supp22ose45_na56me_ 46
我们如何通过使用正则表达式或其他东西在python中执行此操作,但这应该非常快。
我做过像here这样的事情,但想要用非常快的方式实现,所以接近SO
Edit:
抱歉,上面没有提到
有时它只包含something_name
而没有整数,因此我需要检查它是否首先包含一个数字
答案 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