2016-07-27 10 views
3

Ich habe Zeichenfolgen, von denen jede eine oder mehrere Kopien einer Zeichenfolge ist. Zum Beispiel:So teilen Sie eine Zeichenfolge in wiederholte Teilzeichenfolgen

L = "hellohellohello" 
M = "good" 
N = "wherewhere" 
O = "antant" 

Ich mag solche Strings in eine Liste teilen, so dass jedes Element nur den Teil hat, der wiederholt wurde. Zum Beispiel:

splitstring(L) ---> ["hello", "hello", "hello"] 
splitstring(M) ---> ["good"] 
splitstring(N) ---> ["where", "where"] 
splitstring(O) ---> ["ant", "ant"] 

Da die Strings jeweils über 1000 Zeichen lang sind, wäre es großartig, wenn dies auch einigermaßen schnell wäre.

Beachten Sie, dass in meinem Fall die Wiederholungen alle am Anfang des Strings beginnen und keine Lücken dazwischen haben, also ist es viel einfacher als das allgemeine Problem, maximale Wiederholungen in einem String zu finden.

Wie kann man das tun?

+0

nehmen einen Blick auf diese [Frage] (http://stackoverflow.com/questions/11090289/find-longest-repetitive-sequence-i n-a-string) Ich glaube du suchst nach etwas ähnlichem? Außerdem ist die Komplexität dieser Methode O (n), also sollte es ziemlich schnell gemäß Ihrer Anforderung sein. –

+0

@MridulKashyap Meine Frage ist viel einfacher, da meine Wiederholungen am Anfang der Zeichenfolge beginnen und keine Lücken dazwischen haben. – eleanora

Antwort

4

regex Mit dem Wiederholungs Wort zu finden, dann einfach eine Liste der entsprechenden Länge zu erstellen:

def splitstring(string): 
    match= re.match(r'(.*?)(?:\1)*$', string) 
    word= match.group(1) 
    return [word] * (len(string)//len(word)) 
+0

Schöne Idee, dachte ich über so etwas auch. – alex

0

Der Ansatz, den ich verwenden würde:

import re 

L = "hellohellohello" 
N = "good" 
N = "wherewhere" 

cnt = 0 
result = '' 
for i in range(1,len(L)+1): 
    if cnt <= len(re.findall(L[0:i],L)): 
     cnt = len(re.findall(L[0:i],L)) 
     result = re.findall(L[0:i],L)[0] 

print(result) 

gibt die folgenden Ausgänge mit den entsprechenden Variablen:

hello 
good 
where 
1

bereits. Anstatt die Liste zu schneiden, konzentriert sie sich darauf, das kürzeste Muster zu finden, und erstellt dann eine neue Liste, indem sie dieses Muster eine angemessene Anzahl von Malen wiederholt.

def splitstring(s): 
    # searching the number of characters to split on 
    proposed_pattern = s[0] 
    for i, c in enumerate(s[1:], 1): 
     if proposed_pattern == s[i:(i+len(proposed_pattern))]: 
      # found it 
      break 
     else: 
      proposed_pattern += c 
    else: 
     print 'found no pattern' 
     exit(1) 
    # generating the list 
    n = len(proposed_pattern) 
    return [proposed_pattern]*(len(s)//n) 


if __name__ == '__main__': 
    L = 'hellohellohellohello' 
    print splitstring(L) # prints ['hello', 'hello', 'hello', 'hello'] 
+0

Ich kannte keine dieser 3 Dinge, danke Sir. Ich werde das testen und bearbeiten – BusyAnt

0

Unter der Annahme, dass die Länge des wiederholten Wortes länger als 1 das funktionieren würde:

a = "hellohellohello" 

def splitstring(string): 
    for number in range(1, len(string)): 
     if string[:number] == string[number:number+number]: 
      return string[:number] 
    #in case there is no repetition 
    return string 

splitstring(a) 
+2

Es scheitert an "Aabaab". – cogitovita

0
#_*_ coding:utf-8 _*_ 
import re 
''' 
refer to the code of Gábor Erds below 
''' 

N = "wherewhere" 
cnt = 0 
result = '' 
countN = 0 
showresult = [] 

for i in range(1,len(N)+1): 
    if cnt <= len(re.findall(N[0:i],N)): 
     cnt = len(re.findall(N[0:i],N)) 
     result = re.findall(N[0:i],N)[0] 
     countN = len(N)/len(result) 
for i in range(0,countN): 
    showresult.append(result) 
print showresult 
+0

Bitte fügen Sie eine Erklärung hinzu, warum sich Ihr Code von [Gábor Erdős Beitrag] unterscheidet (http://stackoverflow.com/a/38608219/5488275). –

Verwandte Themen