В вашем паттерне (PROC SQL;|proc sql;(.*?)RUN;|quit;|QUIT;)
- это опечатка, я думаю, так как вам не хватает закрывающей скобки )
после proc sql;
и до (.*?)
, а также открывающей скобки (
после. Однако это еще не все, вы все равно не получите желаемый результат с исправленной опечаткой.
Посмотрите документы Python для re
:
.
(Точка). В режиме по умолчанию это соответствует любому символу, кроме новой строки. Если был указан флаг DOTALL
, он соответствует любому символу, включая символ новой строки.
Поскольку ваш ввод содержит символы новой строки, которым вы хотите .
, вы должны использовать re.DOTALL
флаг. Пока мы обсуждаем тему флагов: вы также можете использовать флаг re.IGNORECASE
, если вы действительно не заботитесь о чувствительности своих ключевых слов к регистру.
Кроме того, я думаю, вы не хотитеВаши ключевые слова, такие как PROC SQL;
в вашем результате, так что вы можете использовать (?:...)
, который является версией обычных скобок без захвата.
Конечный шаблон регулярного выражения:
re.findall(r"(?:PROC SQL;)(.*?)(?:RUN;|QUIT;)", text, flags=re.IGNORECASE|re.DOTALL)
Обновление:
В указанном выше коде обновления в ячейке Jupyter результаты re.findall
сохраняются как переменная regex
. Это список строк, которые соответствуют шаблону. Если вы позвоните print(regex)
, вы распечатаете список (в котором будут показаны его элементы, строки с \n
). Если вы не хотите \n
, вы можете вместо этого напечатать элементы (сами строки): print(*regex)
Разделителем по умолчанию между двумя элементами будет простой символ пробела, поэтому вы можете установить sep
вчто-то еще, например, несколько новых строк print(*regex, sep="\n"*5)
или разделительная строка -----
, например print(*regex, sep="\n"+"-"*44+"\n")
. Но это то, что вам нужно решить, какой способ подойдет вам лучше всего для представления ваших результатов.
Кроме того, если шаблон уже не кажется слишком запутанным, вы можете использовать «встроенные модификаторы» вместоflags
аргумент. Это (?i:...)
для сопоставления без учета регистра и (?s:...)
вместо флага DOTALL
:
re.findall(r"(?i:PROC SQL;)((?s:.*?))(?i:RUN;|QUIT;)", text)