拆分数字模式

时间:2012-07-02 14:30:47

标签: python string algorithm

我现在想如何拆分字符串 44664212666666 into [44664212 , 666666]58834888888888 into [58834, 888888888] 不知道最后一个重复数字出现的位置。 所以将它传递给函数说seperate(str) - > [non_recurring_part, end_recurring digits]

8 个答案:

答案 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);