Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [opgelost]RegEx probleempje  (gelezen 366 keer)

Offline MKe

  • Lid
  • Steunpunt: Nee
[opgelost]RegEx probleempje
« Gepost op: 2013/04/03, 13:28:53 »
Hoi,

Ik heb een probleempje met regex en groepen. Misschien zoek ik het te moeilijk, maar als iemand een beter idee heeft hoor ik dat graag.
De bedoeling is dat ik met python en de re module een string uitrafel (en nee, het is geen schoolopdracht, school ligt al 20 jaar achter me :D )

Allereerst wat wel lukkt.
Er zijn een hoop regels in een file met een gelijkwaardig format:
Citaat
>sp|Q6V4H0|10HGO_CATRO 8-hydroxygeraniol dehydrogenase OS=Catharanthus roseus GN=TEST PE=1 SV=1
Ik wil hier graag de losse onderdelen van hebben. Dit kan ik met de volgende regex doen.
>> import re
>> a= '>sp|Q6V4H0|10HGO_CATRO 8-hydroxygeraniol dehydrogenase OS=Catharanthus roseus GN=TEST PE=1 SV=1'
>> r = re.compile(r'>(?P<db>.*)\|(?P<uni>.*)\|(?P<last>.*?) (?P<descr>.*) OS=(?P<OS>.*) GN=(?P<GN>.*) PE=(?P<PE>\d) SV=(?P<SV>\d)')
>> m = r.search(a)
>> m.group('GN')
TEST
>> m.group('descr')
8-hydroxygeraniol dehydrogenase OS=Catharanthus roseus
Dit werkt dus. Maar nu komt mijn moeilijkheid. Het stukje "GN=(?P<GN>.*)" is niet altijd aanwezig. Dus de regel kan ook zo zijn:
>sp|Q6V4H0|10HGO_CATRO 8-hydroxygeraniol dehydrogenase OS=Catharanthus roseus PE=1 SV=1Dit betekent dat mijn regex statement niets vind en mijn python script met veel geschreeuw de pijp aan maarten geeft.
Ik wil dan wel gewoon de rest kunnen uitlezen en de GN leeg laten. Dit lukt mij niet. Ik heb wel een regex gemaakt die gewoon GN negeert en dus de andere groepen gewoon leest, maar het lukt me niet om GN wel uit te lezen als die aanwezig is. Dus:
>> import re
>> a = '>sp|Q6V4H0|10HGO_CATRO 8-hydroxygeraniol dehydrogenase OS=Catharanthus roseus GN=TEST PE=1 SV=1' # met GN component
>> b = '>sp|Q6V4H0|10HGO_CATRO 8-hydroxygeraniol dehydrogenase OS=Catharanthus roseus PE=1 SV=1'  # zonder het GN component
>> r = re.compile(r'>(?P<db>.*)\|(?P<uni>.*)\|(?P<last>.*?) (?P<descr>.*) OS=(?P<OS>.*) (GN=(?P<GN>.*) |)PE=(?P<PE>\d) SV=(?P<SV>\d)')
>> m = r.search(a)
>> n = r.search(b)
>> m.group('GN') # string bevat wel GN
''
>> n.group('GN') # string bevat geen GN
''
Zo een heel ingewikkeld verhaal.

Weet iemand hoe ik die laatste regex string zo kan aanpassen dat ik wel een waarde voor GN groep krijg als het aanwezig is en anders de GN groep leeg laat?
« Laatst bewerkt op: 2013/04/03, 15:25:34 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/

Offline MKe

  • Lid
  • Steunpunt: Nee
Re: RegEx probleempje
« Reactie #1 Gepost op: 2013/04/03, 15:24:24 »
Okay, kostte wat moeite, maar ik ben er toch zelf uit gekomen.
Het probleem bleek te zijn dat de 'GN=..' string toegevoegd werd aan de OS= groep. De oplossing was dus het volgende met de veranderingen vet gedrukt:

>(?P<db>.*)\|(?P<uni>.*)\|(?P<entry>.*?) (?P<descr>.*) OS=(?P<OS>.*?)( GN=(?P<GN>.*?) )?PE=(?P<PE>\d) SV=(?P<SV>\d)