De term DNA sequenering verwijst naar technieken die gebruikt worden om de volgorde van de nucleobasen adenine (A), cytosine (C), guanine (G) en thymine (T) te bepalen voor een DNA molecule. De standaardmanier om deze basen voor te stellen is door de eerste letter van hun naam te gebruiken, ACGT, waardoor DNA kan voorgesteld worden als een string die enkel uit deze vier letters bestaat. DNA strings zijn doorgaans enkele miljoenen basen (karakters) lang.

Substring matching is het proces waarbij bepaald wordt of een kortere string (de substring) voorkomt binnen een langere string. Substring matching speelt een zeer belangrijke rol bij het reconstrueren van een onbekende DNA string uit verschillende kleinere stukken (assemblage1), en bij het zoeken naar interessante substrings (motieven2) binnen een gekende DNA string.

Python voorziet standaard in een string methode find(substring[, start][, end]) die de kleinste index (integer) teruggeeft waarop de $$substring$$ gevonden wordt binnen het interval $$start \leq index < end$$. De parameters $$start$$ en $$end$$ zijn optioneel, en de functie geeft de waarde -1 terug indien de substring niet wordt teruggevonden in de gegeven string. Genoomonderzoekers willen doorgaans echter alle locaties vinden waarop een substring kan teruggevonden worden in een gegeven DNA string. Niet enkel de positie van het eerste voorkomen.

Opgave

Schrijf een functie

motieven(sequentie, subsequentie[, begin][, einde])

waarbij $$begin$$ en $$einde$$ optionele argumenten zijn met standaardwaarden die respectievelijk gelijk zijn aan het begin en het einde van de string sequentie. De waarden $$begin$$ en $$einde$$ moeten hierbij op dezelfde manier geïnterpreteerd worden als bij het slicen van strings of lijsten: \[0 = begin \leq index < einde = \text{len(string)}\] De functie moet een lijst van posities teruggeven waarop de subsequentie voorkomt binnen de gegeven sequentie. Als posities in de lijst worden de indices opgenomen van de eerste letter van de subsequentie binnen de sequentie, waarvoor geldt dat $$begin \leq index < einde$$.

Voorbeeld

>>> motieven('AAA', 'A')
[0, 1, 2]
>>> motieven('AAA', 'A', begin=1)
[1, 2]
>>> motieven('AAA', 'A', einde=2)
[0, 1]
>>> motieven('AAA', 'A', begin=1, einde=2)
[1]
>>> motieven('AAA', 'AA')
[0, 1]
>>> motieven('AAA', 'C')
[]
>>> motieven('AGGAATGCTCGTAGGATACTGAATGCTCGGACGTACGCT', 'GGA')
[1, 13, 28]