Извлечение внутренней части выражения с использованием REGEX - PullRequest
2 голосов
/ 08 октября 2019

В настоящее время у меня есть это регулярное выражение, которое я использую, чтобы сопоставить результат запроса SQL: [^\\n]+(?=\\r\\n\\r\\n\(1 rows affected\)). Тем не менее, он работает не так, как задумано ....

'\r\n----------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------\r\nCS: GPS
on Date.

                                                      \r\n\r\n(1 rows affected)\r\n'

Из приведенного выше выражения я получаю Date, тогда как я бы хотел сопоставить CS: GPS on Date. Хорошо, если есть начальные и следующие пробелы. .. Ничего, отделка Python не может справиться. Как я могу изменить свое регулярное выражение, чтобы совпадение было выполнено правильно?

Заранее спасибо.

Редактировать: Я использую версию Python Python 3.6

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Вы получаете текущее совпадение, потому что класс символов [^\\n]+ соответствует 1+ раз любому символу, кроме \ или n.

Тогда положительный прогноз утверждает, что справа - \r\n\r\n(1 rows affected)что приводит к совпадению Date.

См. https://regex101.com/r/wDzq8l/1

Вы можете использовать не жадный .+? в группе захвата и сопоставить то, что следует, вместо использования положительного взгляда.

В коде используйте re.DOTALL, чтобы точка соответствовала новой строке.

-\\r\\n(.+?) ?\\r\\n\\r\\n\(\d+ rows affected\)

Regex demo

0 голосов
/ 08 октября 2019

Может быть, какое-то выражение, похожее на:

-{5,}\s*([A-Za-z][^.]+\.)

, извлечет это или будет похоже на это.

Демо

Тест

import re

regex = r'-{5,}\s*([A-Za-z][^.]+\.)'
string = '''

----------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------
CS: GPS
on Date.

                                                      \r\n\r\n(1 rows affected)\r\n
'''

print(re.findall(regex, string, re.DOTALL))

Вывод

['CS: GPS\non Date.']

Если вы хотите упростить / изменить /исследуйте выражение, это было объяснено на верхней правой панели regex101.com . Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


...