Многострочный паттерн с конкретным окончанием - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь найти совпадение с каким-либо многострочным шаблоном, который имеет конкретное окончание последовательности последней строки.

Я использую re.DOTALL | re.MULTILINE, чтобы соответствовать многострочному, но он не перехватывает конец первой строки, которую я хочу.

title = re.compile(
    r"TITLE\([^\"\);]*",
    re.DOTALL | re.MULTILINE
)

titles = re.findall(patterns.title, file)

Строка в форме:

TITLE("blah
    blah_blah
    contain_"
    contain_)
    contain_;
    but_not_");
");

И результат Title(", но я хочу всю строку.

1 Ответ

0 голосов
/ 26 июня 2019

Один из способов решить эту проблему - использовать запрос для проверки «конечного токена», в вашем случае ");

re.compile(r"TITLE\(\"((?:(?!\"\);).)*)", re.DOTALL | re.IGNORECASE)

будет соответствовать этой части строки вашего примера

blah_blah
contain_"
contain_)
contain_;
but_not_

Объяснение:

TITLE            # literal: TITLE (case-insensitive with re.IGNORECASE)
\(\"             # literal: ("
(                # group 1
  (?:            #   non-capturing group
    (?!          #     negative look-ahead
      \"\);      #       not followed by: ");
    )            #     end look-ahead
    .            #     match next character (including \n with re.DOTALL)
  )*             #   end non-capturing group, repeat
)                # end group 1 (will contain the final match)

https://regex101.com/r/km3uuV/1

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