Регулярное выражение: не сопоставлять строку, если она находится между двумя другими указанными строками - PullRequest
1 голос
/ 01 апреля 2020

Предположим, какой-то текст в следующем формате:

% Select this string

Also select the string % beyond the percentage sign

But don't select the string \% beyond the percentage sign preceded by \

\begin{example}
[some arbitrary text...]
% Don't select this string
[some arbitrary text...]
\end{example}

% Do select this string

\begin{example}
[some arbitrary text...]
% Don't select this string
[some arbitrary text...]
\end{example}

Я хочу сопоставить каждую строку за пределами % (включая %), кроме тех, которые находятся между \begin{example} и \end{example} и те, которые начинаются со знака процента, которому предшествуют \, например \%.

Как мне go сделать это, используя Python?

Я застрял с (?<!\\)%.*.

Ответы [ 2 ]

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

Моя попытка ответить на этот вопрос (я новичок в Stack Overflow, и это мой первый ответ) требует меньше регулярных выражений, но, тем не менее, она работает:

import re
def search_text(string):
    text = (text + " ").split("\n")  #split text based on newlines
    selected_lines = []  #will store strings meeting requirements
    in_answer = False   #boolean used for determining whether string is in \begin{example} and \end{example}
    for line in text:
        if line.lstrip().startswith("\begin{example}"):  #if line begins with \begin{example}, we can generally skip anything inside by changing in_example to True
            in_example = True
        elif line.lstrip().startswith("\end{example}"):
            in_example = False
        if not in_answer:
            regex = re.compile(r"[^\\]+%[^\\%]+")  #regex for substring that can be added to selected_lines
            search = regex.search(line)
            if search is None:
                continue
            else:
                selected_lines.append(search.group())
    return selected_lines

Просто запустите функцию на строка как это:

"%Select this line \n Also select the line \% beyond the percentage sign \n \begin{example} \n %Don't select this line [Some arbitrary text] \n \end{example} \n %Select me \%Nothing else"
0 голосов
/ 01 апреля 2020

Вы можете использовать группу захвата, сохраняя то, что вы хотите, это целая строка после знака процента.

Но сначала сопоставьте то, что вы не хотите, то есть от \begin{example} до \end{example} ,

Поскольку точка не пересекает новые строки, вы можете использовать [\s\S]*?, чтобы охватить несколько строк.

\\begin{example}[\s\S]*?\\end{example}|((?<!\\)%.*)

Regex demo

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