Jak uchwycić kilka linii wokół dopasowania wyrażenia regularnego?

8

Szukam wyrażenia regularnego, aby dopasować kilka linii ponad dopasowaną linią. Na przykład:

ABCDEFGHADEFGH
ABCDEFGHADEFGH
ABCDEFGHDEFGHABCDEFGH
ABCDEFGHDEFGHABCDEFGH
ABCDEFGHABCDEFGHABCDEFGH
ABCDEFGHABCDEFGHABCDEFGH
XXXXXXXX

Chciałbym uchwycić 2 linie powyżej XXXXXXXX.

Każda pomoc będzie mile widziana. Uwaga: w Pythonie za pomocą biblioteki re

takobaba
źródło
1
Korzystasz z jakiego oprogramowania? Różne programy mają różne wyobrażenia o tym, czym jest wyrażenie regularne.
David Richerby,
Używasz Pythona konkretnie lub w jakimkolwiek narzędziu / języku?
kenorb
Jeśli używasz Pythona, lepiej zrzucić całość do tablicy, w której każdy wiersz jest własnym elementem. Następnie zapętlasz tablicę, znajdując XXXXXXXX. Po znalezieniu użyj indeksu tego elementu -1 i -2, aby uzyskać linie.
LPChip
cześć człowieku dzięki za radę, zrobiłem to już z pętlą for, ale zastanawiam się, jak zrobić z regex
takobaba

Odpowiedzi:

15

Poniższy RegEx sprawdza zmienną liczbę linii przed XXXXXXXXlinią i zwraca je w pierwszej grupie przechwytywania.

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

  1. (.*\n)sprawdza ciąg znaków zakończony \nznakiem nowej linii.
  2. {2} określa to 2 razy.
  3. () wokół, dzięki czemu wszystkie linie są w jednej grupie przechwytywania.
  4. XXXXXXXX jest ciągiem, na którym tekst musi się kończyć.

Teraz w Pythonie możesz użyć, p.match(regex)[0]aby zwrócić pierwszą grupę przechwytywania.

erikgaal
źródło
4
Zachowaj ostrożność, ponieważ może to powodować problemy w systemie Windows. Jeśli tak, spróbuj \r\nzamiast po prostu \n.
Qix - MONICA ZOSTAŁ SZYBOWIONY 14.04.15
1
Oczywiście będzie to pasować tylko do linii, która zaczyna się od XXXXXXXX(ale niekoniecznie kończy się na XXXXXXXX).
G-Man mówi „Reinstate Monica”
0

Dodając do odpowiedzi erikgaal, użyj dodatkowego. * Przed xxxxxx, aby dopasować tabulatory / białe spacje.

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

Suraj Ravindra Khurana
źródło
1
Cóż, .*nie będzie pasować tylko TABS / przestrzenie; pasuje do wszystkiego (np. „Szybki brązowy XXXXXXX”).
G-Man mówi „Przywróć Monikę”