2017-03-26 2 views
1

Wie würden Sie einen normalen String in so viele identische Teile wie möglich aufteilen, während Sie alle Zeichen verwenden. Zum BeispielSuchen Sie nach dem sich wiederholenden Teilstring, aus dem ein String besteht, wenn er existiert

a = "abab" 

Würde "ab" zurückkehren, während bei

b= "ababc" 

Es wäre "ababc" zurückkehren, da es nicht in identische Teile geteilt werden kann, alle Buchstaben.

+1

Possible Duplikat [Count Vorkommen eines Zeichens in einer Zeichenfolge] (http://stackoverflow.com/questions/1155617/count-occurrence-of-a-character- in-a-string) –

+1

@ObsidianAge nein, das ist kein Duplikat. Diese Frage sucht nach wiederholten Teilzeichenfolgen, nicht nach Zeichenanzahl. –

Antwort

2

Dies ist sehr ähnlich, aber nicht identisch mit How can I tell if a string repeats itself in Python? - mit dem Unterschied, dass diese Frage nur, ob eine Zeichenfolge, um zu bestimmen, fragt aus identischem Wiederholung Teil gemacht wird, und nicht als das, was die Wiederholungsteilkette (falls vorhanden) ist.

Die akzeptierte (und bei weitem die best leistungs) answer auf diese Frage angepasst werden kann, die sich wiederholende Zeichenfolge zurückgeben, wenn es einen gibt:

def repeater(s): 
    i = (s+s)[1:-1].find(s) 
    if i == -1: 
     return s 
    else: 
     return s[:i+1] 

Beispiele:

>>> repeater('abab') 
'ab' 
>>> repeater('ababc') 
'ababc' 
>>> repeater('xyz' * 1000000) 
'xyz' 
>>> repeater('xyz' * 50 + 'q') 
'xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzq' 
0

Es scheint, dass Wiederholung Teilkette hat keine vor und nach Buchstaben, so könnte es auch so sein:

In[4]: re.sub(r'^([a-z]+)\1$',r'\1','abab') 
Out[4]: 'ab' 
In[5]: re.sub(r'^([a-z]+)\1$',r'\1','ababc') 
Out[5]: 'ababc' 

([a-z] +) bedeutet Teilzeichenfolge, \ 1 bedeutet Wiederholung.

EDIT:

re.sub(r'^([a-z]+)\1{1,}$',r'\1','abcabcabcabc') 
'abc' 
+0

Dies funktioniert nur, wenn der Teilstring genau einmal wiederholt wird. Es würde nicht für "Ababab" funktionieren. – saulspatz

+0

Edit für mehrere Wiederholungen. –

Verwandte Themen