Como capturar algumas linhas em torno de uma correspondência de regex?

8

Estou procurando uma expressão regex para corresponder a duas linhas na linha correspondente. Por exemplo:

ABCDEFGHADEFGH
ABCDEFGHADEFGH
ABCDEFGHDEFGHABCDEFGH
ABCDEFGHDEFGHABCDEFGH
ABCDEFGHABCDEFGHABCDEFGH
ABCDEFGHABCDEFGHABCDEFGH
XXXXXXXX

Gostaria de capturar as 2 linhas acima do XXXXXXXX.

Qualquer ajuda seria apreciada. Nota: com Python usando a biblioteca re

Takobaba
fonte
11
Usando qual software? Programas diferentes têm idéias diferentes sobre o que é um regexp.
David Richerby
Você está usando Python especificamente ou em qualquer ferramenta / linguagem?
kenorb
Se você estiver usando python, pode ser melhor despejar o todo em uma matriz, onde cada linha é seu próprio elemento. Em seguida, você percorre a matriz, encontrando XXXXXXXX, uma vez encontrado, use o índice desse item -1 e -2 para obter as linhas.
precisa saber é o seguinte
oi homem obrigado pelo conselho, eu fiz isso já com um loop for, mas querendo saber como fazer com regex
takobaba

Respostas:

15

O RegEx a seguir testa uma quantidade variável de linhas antes da XXXXXXXXlinha e as retorna no primeiro grupo de captura.

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

  1. (.*\n)testa uma sequência que termina com \numa nova linha.
  2. {2} quantifica isso 2 vezes.
  3. () isso garante que todas as linhas entrem em um grupo de captura.
  4. XXXXXXXX é a sequência com a qual o texto deve terminar.

Agora em Python, você pode usar p.match(regex)[0]para retornar o primeiro grupo de captura.

erikgaal
fonte
4
Cuidado, pois isso pode causar problemas no Windows. Se isso acontecer, tente em \r\nvez de apenas \n.
Qix - MONICA FOI ERRADA EM 14/04
11
Obviamente, isso corresponderá apenas a uma linha que começa com XXXXXXXX(mas não necessariamente termina com XXXXXXXX).
G-Man diz 'Reinstate Monica' em
0

Adicionando à resposta do erikgaal, use um extra. * Antes de xxxxxx, para corresponder a quaisquer guias / espaços em branco.

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

Suraj Ravindra Khurana
fonte
11
Bem, .*não corresponderá apenas a tabs / espaços; corresponderá a qualquer coisa (por exemplo, "O marrom rápido XXXXXXX").
G-Man diz 'Reinstate Monica' em