Як зафіксувати пару рядків навколо збігу регулярних виразів?


8

Я шукаю вираз регулярного виразів, щоб відповідати пару рядків по збіжній лінії. Наприклад:

ABCDEFGHADEFGH
ABCDEFGHADEFGH
ABCDEFGHDEFGHABCDEFGH
ABCDEFGHDEFGHABCDEFGH
ABCDEFGHABCDEFGHABCDEFGH
ABCDEFGHABCDEFGHABCDEFGH
XXXXXXXX

Я хотів би захопити 2 рядки над XXXXXXXX.

Будь-яка допомога буде вдячна. Примітка: з Python за допомогою бібліотеки re


1
Використовуючи яке програмне забезпечення? Різні програми мають різні уявлення про те, що таке регулярний вираз.
Девід Річербі

Використовуєте Python спеціально або будь-яким інструментом / мовою?
kenorb

Якщо ви використовуєте python, можливо, краще буде скинути ціле в масив, де кожен рядок є власним елементом. Потім ви перебираєте масив, знаходячи XXXXXXXX, як тільки знайдете, використовуєте індекси цього пункту -1 і -2, щоб отримати рядки.
LPChip

привіт, дякую за пораду, я зробив це вже з циклом, але цікаво, як це зробити з regex
takobaba

Відповіді:


15

Наступні RegEx тестує змінну кількість рядків перед XXXXXXXXрядком і повертає їх у першій групі захоплення.

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

  1. (.*\n)тести на рядок, що закінчується \n, новий рядок.
  2. {2} кількісно визначає це у 2 рази.
  3. () навколо, що гарантує, що всі рядки входять у одну групу захоплення.
  4. XXXXXXXX це рядок, яким текст повинен закінчуватися.

Тепер у Python ви можете використовувати p.match(regex)[0]для повернення першої групи захоплення.


4
Будьте обережні, це може спричинити проблеми в Windows. Якщо так, спробуйте \r\nзамість просто \n.
Qix - МОНІКА ПОМИЛИЛА

1
Звичайно, це відповідатиме лише рядку, який починається з XXXXXXXX(але це не обов'язково закінчується XXXXXXXX).
G-Man каже "Відновити Моніку"

0

Додавши відповідь до erikgaal, використовуйте додатковий. * Перед xxxxxx, щоб відповідати будь-яким вкладкам / пробілам.

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


1
Ну, .*не збігаються лише вкладки / пробіли; він відповідатиме будь-чому (наприклад, "Швидкий коричневий XXXXXXX").
G-Man каже "Відновити Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.