我现在想知道如何拆分字符串,例如
44664212666666 into [44664212 , 666666]
或
58834888888888 into [58834, 888888888]
不知道最后一个重复数字的第一次出现在哪里。所以将它传递给一个函数说seperate(str)
->[non_recurring_part, end_recurring digits]
问问题
121 次
8 回答
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', '')
于 2012-07-02T14:36:28.807 回答
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')
于 2012-07-02T14:43:23.087 回答
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')
于 2012-07-02T14:45:38.153 回答
0
您不能只从最后一个字符扫描到第一个字符并在下一个字符不等于前一个字符时停止。然后在该索引处拆分。
于 2012-07-02T14:35:22.493 回答
0
def separate(n):
s = str(n)
return re.match(r'^(.*?)((.)\3*)$', s).groups()
于 2012-07-02T14:36:59.270 回答
0
def seperate(s):
return re.findall('^(.+?)('+s[-1]+'+)$',s)
于 2012-07-02T14:37:14.530 回答
0
>>> import re
>>> m = re.match(r'(.*?)((.)\3+)$', '1233333')
>>> print list(m.groups())[:2]
['12', '33333']
这里使用正则表达式。re 的最后一部分((.)\3+)$
说必须重复相同的数字直到字符串的末尾。其余的都是字符串的第一部分。该函数返回对应于re 部分m.groups()
的字符串列表。()
0 元素包含第一部分;1 元素包含第二部分。第三部分不需要,我们可以忽略它。
另一个重要的点是?
在.*?
. 使用您说您需要非贪婪搜索的符号。这意味着您需要尽快切换到 re 的第二部分。
于 2012-07-02T14:38:23.497 回答
0
从末尾开始迭代,向初始数字,只需获取字符发生变化的位置,这应该是子字符串拆分的限制,让限制索引是--> i,那么你的结果将是-->{ 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);
于 2012-07-03T10:11:14.717 回答