Попытка найти большую строку между начальной и конечной точкой с помощью регулярных выражений - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть большой кусок текста, который я проверяю на предмет определенного шаблона, который выглядит по существу так:

     unique_options_search = new Set([
            "updates_EO_LTB",
            "us_history",
            "uslegacy",

etc., etc., etc.

        ]);

      $input.typeahead({
        source: [...unique_options_search],
        autoSelect: false,
        afterSelect: function(value) 

Моя текстовая переменная называется 'html_page', и мои начальная и конечная точки выглядятвот так:

start = "new Set(["
end = "]);"

Я думал, что смогу найти то, что хочу, с помощью этого однострочного:

r = re.findall("start(.+?)end",html_page,re.MULTILINE)

Однако, это ничего не возвращает вообще.Что здесь не так?Я видел другие примеры онлайн, которые работали нормально.

1 Ответ

0 голосов
/ 21 декабря 2018

Здесь есть несколько проблем.

  1. Как упомянуто @EthanK в комментариях, "start(.+?)end" в Python - это строка, которая описывает регулярное выражение, которое буквально соответствует start, затем чему-то, а затем буквальносоответствует end.Переменные start и end здесь не имеют значения.Возможно, вы хотели написать здесь start + "(.+?)" + end.
  2. . в Python не соответствует переводу строки.re.MULTILINE здесь не имеет значения, оно только меняет поведение ^ и $ (см. docs ).Вместо этого следует использовать re.DOTALL (см. документы ).
  3. Значения start и end включают символы со специальным значением в регулярном выражении (например, ( и [),Вы должны убедиться, что с ними не обращаются специально.Вы можете либо экранировать их вручную с нужным номером \, либо просто делегировать эту работу на re.escape, чтобы получить регулярное выражение, которое буквально соответствует тому, что вам нужно.

Объединениевсе это вместе:

import re
html_page = """
     unique_options_search = new Set([
            "oecd_updates_EO_LTB",
            "us_history",
            "us_legacy",

etc., etc., etc.

        ]);

      $input.typeahead({
        source: [...unique_options_search],
        autoSelect: false,
        afterSelect: function(value) 
"""

start = "new Set(["
end = "]);"
# r = re.findall("start(.+?)end",html_page,re.MULTILINE)  # Old version
r = re.findall(re.escape(start) + "(.+?)" + re.escape(end), html_page, re.DOTALL)  # New version
print(r)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...