2010-04-04 4 views
0

Mes amis,Comment extraire quelques cordes marquées d'une ligne (python)

J'ai passé pas mal de temps sur celui-ci ... mais ne peut pas comprendre encore une meilleure façon de le faire. Je suis en train de coder en python.

Donc, voici une ligne de texte dans un fichier, je travaille avec, par exemple:

"> ref | ZP_01631227.1 | 3-déshydroquinate synthase [Nodularia spumigena CCY9414] ..."

Comment puis-je extraire les deux chaînes "ZP_01631227.1" et "Nodularia spumigena CCY9414" de la ligne?

Les paires de "| |" et les parenthèses sont comme des marqueurs donc nous savons que nous voulons obtenir les chaînes entre les deux ...

Je suppose que je peux probablement boucler tous les caractères de la ligne et le faire à la dure. Cela prend juste tellement de temps ... Vous vous demandez s'il y a une bibliothèque python ou d'autres façons intelligentes de le faire bien?

Merci à tous!

Répondre

1
>>> for line in open("file"): 
...  if "|" in line: 
...   whatiwant_1=line.split("|")[1] 
...   if "[" in line: 
...    whatiwant_2=line.split("[")[1].split("]")[0] 
... 
>>> print whatiwant_1 , whatiwant_2 
ZP_01631227.1 Nodularia spumigena CCY9414 
+0

C'est exactement la solution dont j'avais besoin! Merci beaucoup! – GoJian

4

Une alternative concise est une expression régulière (pour une raison quelconque, ils ont une mauvaise réputation dans la communauté Python, mais ils offrent la concision et de puissance pour le traitement de texte simple):

import re 
s = ">ref|ZP_01631227.1| 3-dehydroquinate synthase [Nodularia spumigena CCY9414]..." 
mo = re.search(r'\|(.*?)\|/*\[(.*?)\]', s) 
if mo: 
    thefirst, thesecond = mo.groups() 
+1

Voulez-vous dire 'mo = re.search (r '\ | (. *?) \ |. * \ [(. *?) \]', S)'? –

+0

En ce qui concerne la mauvaise réputation des regexps dans la communauté Python, je dirais que la documentation est un peu intimidante par rapport à, disons, la documentation Perl (perlrequick). Un tutoriel doux rempli d'exemples pourrait être utilement ajouté au début de la documentation 're' actuelle, par exemple. – EOL

+0

@gnibbler, oui, j'avais laissé tomber le 's', tx pour spotting, éditer pour réparer. –