[PHP]un 'tit problème de regex

Résolu
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   -  
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous et toutes,
J'ai un petit problème d'expression régulière. Je m'explique : j'ai un texte au format suivant :

>P15711|104K_THEPA 104 kDa microneme/rhoptry antigen precursor - Theileria parva
MKFLILLFNILCLFPVLAADNHGVGPQGASGVDPITFDINSNQTGPAFLTAVEMAGVKYL
QVQHGSNVNIHRLVEGNVVIWENASTPLYTGAIVTNNDGPYMAYVEVLGDPNLQFFIKSG
DAWVTLSEHEYLAKLQEIRQAVHIESVFSLNMAFQLENNKYEVETHAKNGANMVTFIPRN
GHICKMVYHKNVRIYKATGNDTVTSVVGFFRGLRLLLINVFSIDDNGMMSNRYFQHVDDK
YVPISQKNYETGIVKLKDYKHAYHPVDLDIKDIDYTMFHLADAT

Et je souhaiterais récupérer dans 2 variables distinctes les données comprises entre le > et | dans la première variable, et les données en majuscule (à partir de la deuxième ligne et jusqu'à la fin) dans la deuxième variable. Pour schématiser, j'ai
>XXXXX|Yyyyyy yyyyy yyyyyyyy yyyyyyy y yyyyyy yyyyy
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

et je voudrais obtenir :
$Nom = XXXXX et $seq = ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ...

Voilà, j'ai déja créé ceci comme expression régulière :
"#>([A-Z0-9]+)|[a-zA-Z0-9_]+\r\n([A-Z]+)#"

Ca marche très bien pour les XXXXX mais il ne me renvoit rien pour les ZZZZZZZZZZ
Why ?

Merci d'avance :D
A voir également:

9 réponses

sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
Mais c'est bien sûr, l'erreur la plus grosse était bien le \r\n qui devait se transformer en \n
L'espace je l'avais mis, j'ai juste oublié de le recopier mais bon peu importe, CA MARCHE !!!

Merci beaucoup à vous tous
2
clad
 
regarde sur https://openclassrooms.com/fr/courses

si cela peut t'aider, je vais regarder ton code ^^
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
Le tuto du site du zéro, pas de problème, je le connais par coeur à force de taper dedans, mais autant d'habitude j'avais pas de problème (ou plutôt si j'en avais mais je m'en sortais), autant là !!!! Vraiment je vois pas.
0
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
Bonjour,

a mon avis c'est un pb de methode.

Une piste:

variable1 = ce qui commence par ">" et finit par "|" (par une regex)
puis par un substr j'enlève le ">" du debut et le "|" de la fin

variable2= commence par une minuscule, puis au moins N majuscules et finit par une majuscule (par une Regex encore)

pareil tu vires ensuite ce qui est en trop.

@lain
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Bonjour,

Le problème vient du caractère | qui veut dire "OU" dans une expression rationnelle* !
Il faut l'échapper en mettant un \ devant...

Xavier

* Et non pas « expression régulière », qui est une mauvaise traduction de l'anglais « regular expression »
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
Ca j'ai essayé, de l'échapper le | dans mon expression rationnelle* mais dans ce cas là je n'obtient plus rien du tout et je ne comprend pas non plus pourquoi...

* Et en Breton ça se dit comment "regular expression"

Sinon pour Alain_42, étant donné que je vais bosser sur quelque centaines de milliers de séquences, je préfère limiter le nombre de fonctions utilisées pour aller un peu plus vite, et je sais que les expression rationnellles permettent de le faire
-
Proverbes breton :
Si les mouettes ont pied, il est temps de virer
Il vaut mieux être saoul que con, ça dure moins longtemps
0
ceddec Messages postés 148 Date d'inscription   Statut Membre Dernière intervention   82
 
Bonjour,

Je pense aussi qu'il faut protéger le | et il manque l'espace pour ton test sur les yyy. Il manque aussi les retours à la ligne pour les zzz

L'expression deviendrait :
>([A-Z0-9]+)\|[a-zA-Z0-9_ ]+\r\n([A-Z\r\n]+)

Il faut aussi s'assurer que ton retour à la ligne se fait bien avec \r\n et non pas avec \n

0
Jean-François Pillou Messages postés 19261 Date d'inscription   Statut Webmaster Dernière intervention   63 277
 
Pour être sûr que ça fonctionne, il faut penser à mettre les commutateurs s et m à la fin indiquant respectivement que les parenthèses sont capturantes et que la regexp est multiligne :

"#>([A-Z0-9]+)|[a-zA-Z0-9_]+\r\n([A-Z]+)#sm" 
0
sly-bzh Messages postés 415 Date d'inscription   Statut Membre Dernière intervention   118
 
ah ben j'ai appris quelque chose là... Merci beaucoup de la précision :D
0