Comment capturer quelques lignes autour d'une correspondance d'expression régulière?

8

Je recherche une expression regex pour faire correspondre quelques lignes sur la ligne correspondante. Par exemple:

ABCDEFGHADEFGH
ABCDEFGHADEFGH
ABCDEFGHDEFGHABCDEFGH
ABCDEFGHDEFGHABCDEFGH
ABCDEFGHABCDEFGHABCDEFGH
ABCDEFGHABCDEFGHABCDEFGH
XXXXXXXX

Je voudrais capturer les 2 lignes au-dessus du XXXXXXXX.

Toute aide serait appréciée. Remarque: avec Python utilisant la bibliothèque re

takobaba
la source
1
Avec quel logiciel? Différents programmes ont des idées différentes sur ce qu'est une expression rationnelle.
David Richerby du
Vous utilisez Python spécifiquement ou dans n'importe quel outil / langage?
kenorb
Si vous utilisez python, il peut être préférable de vider le tout dans un tableau, où chaque ligne est son propre élément. Vous parcourez ensuite le tableau, en trouvant XXXXXXXX, une fois trouvé, utilisez l'index de cet élément -1 et -2 pour obtenir les lignes.
LPChip
salut homme merci pour les conseils, je l'ai déjà fait avec une boucle for mais je me demande comment faire avec regex
takobaba

Réponses:

15

Le RegEx suivant teste une quantité variable de lignes avant la XXXXXXXXligne et les renvoie dans le premier groupe de capture.

((.*\n){2})XXXXXXXX

  1. (.*\n)teste une chaîne se terminant par \n, une nouvelle ligne.
  2. {2} quantifie cela 2 fois.
  3. () autour qui s'assure que toutes les lignes viennent dans un groupe de capture.
  4. XXXXXXXX est la chaîne avec laquelle le texte doit se terminer.

Maintenant en Python, vous pouvez utiliser p.match(regex)[0]pour retourner le premier groupe de capture.

erikgaal
la source
4
Attention, cela peut provoquer des problèmes sous Windows. Si c'est le cas, essayez \r\nplutôt que juste \n.
Qix - MONICA A ÉTÉ BRUÉE le
1
Bien sûr, cela ne correspondra qu'à une ligne commençant par XXXXXXXX(mais ne se terminant pas nécessairement par XXXXXXXX).
G-Man dit `` Réintègre Monica ''
0

Pour ajouter à la réponse d'erikgaal, utilisez un supplément. * Avant xxxxxx, pour faire correspondre les tabulations / espaces blancs.

((. * \ n) {2}). * xxxxxxx

Suraj Ravindra Khurana
la source
1
Eh bien, .*ne correspondra pas seulement aux tabulations / espaces; il correspondra à tout (par exemple, "The quick brown XXXXXXX").
G-Man dit `` Réintègre Monica ''