Совпадение с REGEX для частей документа между двумя заголовками - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь и не могу написать python совместимый REGEX, который захватывает несколько частей документа. Мой код на самом деле будет в Python, но сейчас я пробовал только на regex101.com, чтобы получить правильное выражение. (очевидно, безуспешно :))

Мой текст, основанный на файлах, выглядит примерно так:

<# .SYNOPSIS Это краткий текст, то есть многострочный синопсис - я хочу сопоставить весь этот текст как группа захвата. .PARAMETER Это еще один блок многострочный текст, который я хочу захватить .Что-то другой заголовок И некоторый другой многострочный текст # </p>

Я хотел бы захватить 2 группы (заголовок и основной текст), глобально. (т.е. для каждого раздела).

Моей конечной целью является python массив словарей типа;

[ {'header': 'SYNOPSIS', 'text':} {'header': 'PARAMETER', 'text':} ]

Раздел заголовка всегда привязан к началу строки с помощью '.' а затем в верхнем регистре текст. Тело раздела содержит любые слова и несловарные символы, включая CR / LF (на основе windows).

Имена заголовков не обязательно должны быть фиксированными литералами или в определенном порядке c. Также я не знаю, сколько заголовков может существовать.

Сейчас это выглядит так (^\.[A-Z]+)([\n\W\w]+)

Сейчас я могу сопоставить заголовок, за которым следует тело, но у меня время, чтобы РЕГЕКС по существу «перестал искать, когда вы нажмете следующий .HEADERTEXT».

Я создал Regex101 https://regex101.com/r/YqibeH/4, если он используется (не уверен, как это может сработать) ). , ,

Мой псевдо-код говорит что-то вроде:

Найти все строки, начинающиеся с ^. [AZ] в качестве группы захвата, затем продолжить сопоставление всего текста (многострочного) после заголовка в качестве второго захвата группа. Прекратите захват непосредственно перед следующим заголовком, который начинается ^. [AZ]

Любая помощь с благодарностью.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Я верю, что вы ищете, смотреть вперед. Кроме того, поиск, который вы выполняете, является жадным и должен быть заменен на ленивый квантификатор. Что, как говорится. Это должно работать.

^\.\w+[\n\W\w]+?(?=^\.\w+|^#>) https://regex101.com/r/YqibeH/7

^\.\w+ Жадно захватывает текст вашего заголовка.

[\n\W\w]+? Лениво ищет ваш основной текст.

(?=^\.\w+|^#>) до тех пор, пока он не заглянет вперед и не найдет либо строку, начинающуюся с другого текста заголовка, либо строку, начинающуюся с закрывающего тега заголовка.

Обратите внимание, что если жадный квантификатор + будет использоваться вместо +?, он будет продолжать сопоставление до последнего возможного экземпляра, которому он может соответствовать.

0 голосов
/ 01 апреля 2020
text = '<#\n.SYNOPSIS\nThis is the block of code that I would like to have matched along with the .SYNOPSIS header, ' \
       'as this block belongs to SYNOPSIS\n .NOTES\n This block needs to belong with\nNOTES ' \
       'header\n.SOMEOTHERHEADER\nAnd resulting text\n\n#> '
pattern = "(\.[A-Z]+\n)+"
import re

print(re.split(pattern, text))

Если я правильно понял вашу проблему, я решил ее следующим образом. Таким образом, у вас есть список со всеми элементами, которые нужно добавить в ваш словарь, конечно, очистив строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...