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


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.


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”

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.