最後の繰り返し数字の最初の出現場所を知らずに、44664212666666 into [44664212 , 666666]
または
知らずに文字列を分割する方法を知りたいです
。58834888888888 into [58834, 888888888]
それを関数に渡すseperate(str)
-->[non_recurring_part, end_recurring digits]
8 に答える
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', '')
ジャスティンと同じ答え:
>>> 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')
これは、数字の繰り返しがない場合に対処する非正規表現の回答です。
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')
最初の数字に向かって、最後から反復を開始し、発生する文字が変化する位置を取得します。これは、部分文字列分割の制限である必要があります。その制限インデックスを--> 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);
>>> import re
>>> m = re.match(r'(.*?)((.)\3+)$', '1233333')
>>> print list(m.groups())[:2]
['12', '33333']
ここでは正規表現を使用します。re の最後の部分は((.)\3+)$
、文字列の最後まで同じ数字を繰り返さなければならないことを示しています。残りはすべて文字列の最初の部分です。この関数は、re の部分にm.groups()
対応する文字列のリストを返します。()
0 要素には最初の部分が含まれます。1 要素には 2 番目の部分が含まれます。3 番目の部分は必要ありません。無視してかまいません。
もう 1 つの重要なポイントは?
です.*?
。シンボルを使用して、貪欲でない検索が必要だと言います。つまり、できるだけ早く re の 2 番目の部分に切り替える必要があります。
最後の文字から最初の文字までスキャンして、次の文字が前の文字と等しくないときに停止することはできませんか。次に、そのインデックスで分割します。
def separate(n):
s = str(n)
return re.match(r'^(.*?)((.)\3*)$', s).groups()