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


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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.