我现在想如何拆分字符串
44664212666666 into [44664212 , 666666]
或
58834888888888 into [58834, 888888888]
不知道最后一个重复数字出现的位置。
所以将它传递给函数说seperate(str)
- > [non_recurring_part, end_recurring digits]
答案 0 :(得分:5)
print re.findall(r'^(.+?)((.)\3+)$', '446642126666')[0][:-1] # ('44664212', '6666')
正如评论中所指出的,最后一组应该是可选的,以处理没有正确重复符号的字符串:
print re.findall(r'^(.+?)((.)\3+)?$', '12333')[0][:-1] # ('12', '333')
print re.findall(r'^(.+?)((.)\3+)?$', '123')[0][:-1] # ('123', '')
答案 1 :(得分:1)
与贾斯汀相同的答案:
>>> for i in range(len(s) - 1, 0, -1):
if s[i] != s[-1]:
break
>>> non_recurring_part, end_recurring_digits = s[:i], s[i + 1:]
>>> non_recurring_part, end_recurring_digits
('4466421', '666666')
答案 2 :(得分:1)
这是一个非正则表达式的答案,用于处理没有重复数字的情况。
def separate(s):
last = s[-1]
t = s.rstrip(last)
if len(t) + 1 == len(s):
return (s, '')
else:
return t, last * (len(s) - len(t))
示例:
>>> separate('123444')
('123', '444')
>>> separate('1234')
('1234', '')
>>> separate('11111')
('', '11111')
答案 3 :(得分:0)
您不能只扫描最后一个字符到第一个字符,并在下一个字符不等于前一个字符时停止。然后在那个指数处拆分。
答案 4 :(得分:0)
def separate(n):
s = str(n)
return re.match(r'^(.*?)((.)\3*)$', s).groups()
答案 5 :(得分:0)
def seperate(s):
return re.findall('^(.+?)('+s[-1]+'+)$',s)
答案 6 :(得分:0)
>>> import re
>>> m = re.match(r'(.*?)((.)\3+)$', '1233333')
>>> print list(m.groups())[:2]
['12', '33333']
这里使用正则表达式。 re ((.)\3+)$
的最后一部分表示必须重复相同的数字直到字符串结尾。剩下的就是字符串的第一部分。函数m.groups()
返回与re的()
部分对应的字符串列表。 0元素包含第一部分; 1元素包含第二部分。第三部分不需要,我们可以忽略它。
另一个重点是?
中的.*?
。使用符号表示您需要非贪婪的搜索。这意味着您需要尽快切换到re的第二部分。
答案 7 :(得分:0)
从最后开始迭代,朝向初始数字,只是得到字符发生变化的位置,这应该是子字符串分割的限制,让该限制索引是 - >我,然后你的结果将是 - > {sub-string [0,i),sub-string [i,size)} ,,这将解决你的问题..
int pos=0;
String str="ABCDEF";
for (int i = str.length()-1; i > 0; i--)
{
if(str.charAt(i) != str.charAt(i-1))
{
pos=i;
break;
}
}
String sub1=str.substring(0, pos);
String sub2=str.substring(pos);