können Sie eine Rekursion Funktion wie folgt verwendet werden:
Hinweis: Das Ergebnis Argument wird als globale Variable behandelt werden (da vorbei veränderbares Objekt an die Funktion wirkt sich auf den Anrufer)
import re
def finder(st,past_ind=0,result=[]):
m=re.search(r'(.+)\1+',st)
if m:
i,j=m.span()
sub=st[i:j]
ind = (sub+sub).find(sub, 1)
sub=sub[:ind]
if len(sub)>1:
result.append([sub,(i+past_ind+1,j+past_ind+1)])
past_ind+=j
return finder(st[j:],past_ind)
else:
return result
s='AAACACGTACGTAATTCCGTGTGTCCCCTATACGTATACGTTT'
print finder(s)
Ergebnis:
[['ACGT', (5, 13)], ['GT', (19, 25)], ['TATACG', (29, 41)]]
Antwort zur vorherigen Frage für folgende Zeichenfolge:
s = 'AAAC**ACGTACGTA**ATTCC**GTGTGT**CCCC**TATACGTATACG**TTT'
können Sie beide Antworten verwenden, um von mentioned question und einige zusätzliche Rezepte:
Zuerst Sie die Zeichenfolge mit **
aufspalten kann dann eine neue Liste erstellen enthalten die wiederholten Strings mit r'(.+)\1+'
regex:
So das Ergebnis sein wird:
>>> new=[re.search(r'(.+)\1+',i).group(0) for i in s.split('**')]
>>> new
['AAA', 'ACGTACGT', 'TT', 'GTGTGT', 'CCCC', 'TATACGTATACG', 'TTT']
Hinweis über 'ACGTACGT'
dass verpasst die A
am Ende!
Dann können Sie principal_period
‚s Funktion zu erhalten, die wiederholten Teilzeichenfolgen verwenden:
def principal_period(s):
i = (s+s).find(s, 1, -1)
return None if i == -1 else s[:i]
>>> for i in new:
... p=principal_period(i)
... if p is not None and len(p)>1:
... l.append(p)
... sub.append(i)
...
So werden Sie die wiederholten Saiten in l
und Saiten in sub
:
>>> l
['ACGT', 'GT', 'TATACG']
>>> sub
['ACGTACGT', 'GTGTGT', 'TATACGTATACG']
Sie dann brauche eine region
, dass Sie es mit span
Methode tun können:
Und endlich können Sie zip die 3 Liste regon
, sub
, l
und ein dict Verständnis verwenden das erwartete Ergebnis zu erstellen:
>>> z=zip(sub,l,regons)
>>> out={i :{'repeat':i.count(j),'region':reg} for i,j,reg in z}
>>> out
{'TATACGTATACG': {'region': (38, 50), 'repeat': 2}, 'ACGTACGT': {'region': (6, 14), 'repeat': 2}, 'GTGTGT': {'region': (24, 30), 'repeat': 3}}
Der Hauptcode:
>>> s = 'AAAC**ACGTACGTA**ATTCC**GTGTGT**CCCC**TATACGTATACG**TTT'
>>> sub=[]
>>> l=[]
>>> regon=[]
>>> new=[re.search(r'(.+)\1+',i).group(0) for i in s.split('**')]
>>> for i in new:
... p=principal_period(i)
... if p is not None and len(p)>1:
... l.append(p)
... sub.append(i)
...
>>> for t in sub:
... regons.append(re.search(t,s).span())
...
>>> z=zip(sub,l,regons)
>>> out={i :{'repeat':i.count(j),'region':reg} for i,j,reg in z}
>>> out
{'TATACGTATACG': {'region': (38, 50), 'repeat': 2}, 'ACGTACGT': {'region': (6, 14), 'repeat': 2}, 'GTGTGT': {'region': (24, 30), 'repeat': 3}}
Ich denke, sie verwenden etwas namens "Suffix-Baum" für diese ... aber es ist nicht sehr einfach ... und jedes Mal, wenn ich damit anfange, hörte ich nur über die Hälfte Weg https://www.cs.cmu.edu/ ~ ckingsf/bioinfo-lectures/suffixtrees.pdf –
Was zählen Sie zu * "repetitiven Motiven" *? Wenn "GT" zählt, warum nicht z.B. "**", "TT" oder "CC"? Und was genau ist deine Frage? – jonrsharpe
''ACGT'' wird 2 mal nicht wiederholt,' ACGTACGTA' hat ein 'A' am Ende !! – Kasramvd