Я хочу захватить текст, встречающийся между двумя совпадениями регулярных выражений - PullRequest
1 голос
/ 19 июня 2019

Например, это моя строка (это текст из HTML)

html_text = """
TABLE OF CONTENTS

PART I  
| ITEM 1. BUSINESS  
| ITEM 1A. RISK FACTORS  
| ITEM 1B. UNRESOLVED CONFLICTS  
| ITEM 2. PROPERTIES  
| ITEM 3. LEGAL PROCEEDINGS  

    We believe that relations with our employees are good; however, the competition
    for such personnel is intense, and the loss of key personnel could have a
    material adverse impact on our results of operations and financial condition.

    ITEM  1A. |  RISK FACTORS  

    Set forth below and elsewhere in this report and in other documents we file
    with the SEC are descriptions of the risks and uncertainties that could cause
    our actual results to differ materially from the results contemplated by the
    forward-looking statements contained in this report.

    ITEM 1B. UNRESOLVED CONFLICTS

    Our future revenue, gross margins, operating results and net income are
    difficult to predict and may materially"""

Я написал регулярное выражение для записи "ПУНКТ 1А. ФАКТОРЫ РИСКА" ( не из Оглавления )

re.search(r"(ITEM.*1A)*.+(RISK FACTORS).*\n+(?!\w)(?!.*ITEM.*1B)", html_text)

и еще одно регулярное выражение для ввода "ПУНКТ 1B. НЕРЕШЕННЫЕ КОНФЛИКТЫ" ( не из оглавления )

re.search(still trying to figure this out)

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

final_text = """    ITEM  1A. |  RISK FACTORS  

    Set forth below and elsewhere in this report and in other documents we file
    with the SEC are descriptions of the risks and uncertainties that could cause
    our actual results to differ materially from the results contemplated by the
    forward-looking statements contained in this report."""

Ответы [ 2 ]

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

Если вы хотите сопоставить с ITEM 1A. RISK FACTORS и всем последующим, а затем сопоставить следующее ITEM 1B. UNRESOLVED CONFLICTS и все последующие в отдельном сопоставлении, вы можете использовать повторяющийся шаблон с отрицательным прогнозом и сопоставить все последующие строки, которые не соответствуютначинаются с ITEM, пробелы, цифры и заглавные буквы.

^[ \t]+ITEM[ \t]+\d+[A-Z]\.[ \t]+.*(?:\r?\n(?!.*\bITEM[ \t]+\d+[A-Z]).*)*

Пояснение

  • ^
  • [ \t]+ITEM Соответствует 1+ пробелам или табуляциям, за которыми следуют ITEM
  • [ \t]+\d+[A-Z]\. Соответствует 1+ пробелам или табуляциям, за которыми следуют 1+ цифр и заглавные буквы
  • [ \t]+.* Соответствует 1+ пробелам или табуляциямза ним следует любой символ, кроме новой строки
  • (?: Группа без захвата
    • \r?\n Math - новая строка
    • (?! Отрицательный взгляд вперед, утверждают, что справане
      • .*\bITEM[ \t]+\d+[A-Z] Соответствует `ПУНКТ, за которым следуют табуляция или пробелы, 1+ цифры и символ в верхнем регистре
    • ) Закрыть отрицательный прогноз
    • .* Совпадение с любым символом, кроме новой строки 0+ раз
  • )* Закрыть не захватывая группуp и повторите 0+ раз

См. демонстрацию regex | Python demo

Например:

regex = r"^[ \t]*ITEM[ \t]*\d+[A-Z]\.[ \t]+.*(?:\r?\n(?!.*ITEM \d+[A-Z]).*)*"
print(re.findall(regex, html_text, re.MULTILINE))

Примечание: если вы используете только пробелы, эту часть [ \t]+ можно сократить до одного пробела, за которым следует плюсзнак +

^ +ITEM +\d+[A-Z]\. +.*(?:\r?\n(?!.*\bITEM +\d+[A-Z]).*)*
0 голосов
/ 19 июня 2019

Это может сработать для Вас:

re.compile(r"^(    ITEM  1A. \|  RISK FACTORS.+\n(?:\n.+)+)", re.MULTILINE)

Здесь можно увидеть Regex101 , однако имейте в виду, что там он работает иначе из-за неиспользования re.compile(REGEXP, REGEXPOPTION) настроек.

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