Регулярное совпадение, пока не будет задано c строка или конец строки - PullRequest
1 голос
/ 16 апреля 2020

Я пытаюсь создать правильное регулярное выражение для использования в python для многострочного соответствия следующего сценария. Мне нужно пропустить одну строку после совпадения со строкой Описание \ s: затем получить весь текст до первого появления \ s. \ N ИЛИ домашнюю страницу строки: ИЛИ конец строки.

I ' Я пытаюсь выполнить следующее регулярное выражение, однако чего-то не хватает, и не все сценарии ios покрыты: Description\s*:\s*.*\n(?P<description>[\w\s\$\&\+\,\:\;\=\?\@\#\|\'\<\>\.\^\*\(\)\%\!\-]*\n\s*)\s\.

Сценарий 1: Ожидаемый результат:"libX11- xcb предоставляет функции, необходимые клиентам, использующим преимущества Xlib / XCB для смешивания вызовов к Xlib и XCB по одному и тому же соединению X. "

Pre-Depends: multiarch-support
Description: Xlib/XCB interface library
 libX11-xcb provides functions needed by clients which take advantage of
 Xlib/XCB to mix calls to both Xlib and XCB over the same X connection.
 .
 More information about X.Org can be found at:
 <URL:http://www.X.org>
 .
 More information about XCB can be found at:
 <URL:http://xcb.freedesktop.org>
 .
 This module can be found at
 git://anongit.freedesktop.org/git/xorg/lib/libX11

Сценарий 2: Ожидается результат:"Этот пакет содержит ряд важных утилит, большинство из которых ориентированы на обслуживание вашей системы. Некоторые из наиболее важных утилит, включенных в этот пакет, позволяют разбивать ваш жесткий диск, просматривать сообщения ядра и создавать новые файловые системы. "

Essential: yes
Installed-Size: 2999
Replaces: bash-completion (<< 1:2.1-4.1~), initscripts (<< 2.88dsf-59.2~), mount (= 2.26.2-3), mount (= 2.26.2-3ubuntu1), sysvinit-utils (<< 2.88dsf-59.1~)
Pre-Depends: libblkid1 (>= 2.25), libc6 (>= 2.15), libfdisk1 (>= 2.29~rc2), libmount1 (>= 2.25), libncursesw5 (>= 6), libpam0g (>= 0.99.7.1), libselinux1 (>= 2.6-3~), libsmartcols1 (>= 2.28~rc1), libsystemd0, libtinfo5 (>= 6), libudev1 (>= 183), libuuid1 (>= 2.16), zlib1g (>= 1:1.1.4)
Conffiles:
 /etc/default/hwclock 3916544450533eca69131f894db0ca12
Description: miscellaneous system utilities
 This package contains a number of important utilities, most of which
 are oriented towards maintenance of your system. Some of the more
 important utilities included in this package allow you to partition
 your hard disk, view kernel messages, and create new filesystems.

Сценарий 3: Ожидаемый результат: " libcurl - это простая в использовании библиотека передачи URL-адресов на стороне клиента, поддерживающая DICT, FIL E, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TE LNET и TFTP. "

Architecture: blob
Multi-Arch: same
Recommends: ca-certificates
Description: easy-to-use client-side URL transfer library (OpenSSL flavour)
 libcurl is an easy-to-use client-side URL transfer library, supporting DICT,
 FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S,
 RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP.
 .
 libcurl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP
 form based upload, proxies, cookies, user+password authentication (Basic,
 Digest, NTLM, Negotiate, Kerberos), file transfer resume, http proxy tunneling
 and more!
 .
 libcurl is free, thread-safe, IPv6 compatible, feature rich, well supported,
 fast, thoroughly documented and is already used by many known, big and
 successful companies and numerous applications.
 .
 SSL support is provided by OpenSSL.
Homepage: http://curl.haxx.se

Буду признателен за любую помощь, чтобы получить правильное выражение.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

В качестве альтернативы вы также можете получить совпадения, не используя re.DOTALL, сопоставляя все строки, которые не начинаются с пробела и точки, конца строки домашней страницы, используя отрицательный прогноз, чтобы избежать ненужного возврата с помощью .*?* 1002. *

Примечание: экранируйте точку \., чтобы буквально соответствовать ей.

\bDescription:.*\r?\n(?P<description>(?:(?! \.|$|Homepage).*(?:\r?\n)?)*)

По частям:

  • \bDescription:.*\r?\n Описание матча: и остальная часть строки и новая строка
  • (?P<description> именованная группа описание
    • (?: группа без захвата
      • (?! \.|$|Homepage) Утверждение того, что прямо справа ни одна из альтернатив
      • .*(?:\r?\n)? Соответствует любому символу, кроме новой строки 0+ раз, и соответствует дополнительной новой строке
    • )* Закройте группу без захвата и повторите 0+ раз
  • ) Закрыть группу 1

Regex demo

1 голос
/ 16 апреля 2020

Это должно работать.

import re
match = re.search(r'Description:.*?\n(.*?)(\s.\n|$)', str1, re.DOTALL)
print(match.group(1))
...