Повторно используйте тот же префикс, чтобы найти следующее совпадение, если оно есть - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть такие строки:

string = '
something .... something else ...
url="/transfer/packages/00000000-0000-0000-0000-000000000000/connectors/68f74d66-ca3d-4272-9b59-4f737946b3f7/something/138bb190-3b12-4855-88e2-0d1cdf46aeb5/...../...../...../...../...."
other things ...
'

без CR / LF, все в одной строке.

Я хочу создать регулярное выражение, которое:

  • тогда и только тогда, когда URL начинается с /transfer/packages/
  • , захватывает каждый последующий GUID
  • до конца строки в кавычках "
  • число GUID, который нужно найти, неизвестен и является по крайней мере одним

Пока что я написал:

\/transfer\/packages\/[^"]*([A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12})"

, но он захватывает только ПОСЛЕДНЮЮ направляющую. Мне нужно кое-что, как повторно использовать префикс /transfer/packages/ и продолжать сопоставление, жадно расширяя поиск каждый раз, не переходя от префикса.

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

Если вы используете re модуль в Python, тогда, возможно, используйте str.startwith и попробуйте:

import re
url="/transfer/packages/00000000-0000-0000-0000-000000000000/connectors/68f74d66-ca3d-4272-9b59-4f737946b3f7/something/138bb190-3b12-4855-88e2-0d1cdf46aeb5/...../...../...../...../...."
if url.startswith('/transfer/packages/'):
    Guid_List = re.findall(r'(?i)[a-z0-9]{8}(?:-[a-z0-9]{4}){3}-[a-z0-9]{12}', url)
print(Guid_List)
1 голос
/ 15 апреля 2020

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

(?<=url="/transfer/packages/[^\r\n"]*)[A-Za-z0-9]{8}-(?:[A-Za-z0-9]{4}-){3}[A-Za-z0-9]{12}(?=[^\r\n"]*")

Пример Regex demo (с другим выбранным механизмом для демонстрационных целей) или см. Python demo


Другой вариант - сначала сопоставить строку с url="/transfer/packages/, за которой следует guid, и сопоставлять до следующей двойной кавычки .

Тогда вы можете использовать, например, re.findall , чтобы получить все направляющие.

"/transfer/packages/[A-Za-z0-9]{8}-(?:[A-Za-z0-9]{4}-){3}[A-Za-z0-9]{12}[^"\r\n]*"

Regex demo | Python демо

Например:

import re

regex = r'"/transfer/packages/[A-Za-z0-9]{8}-(?:[A-Za-z0-9]{4}-){3}[A-Za-z0-9]{12}[^"\r\n]*"'
test_str = ("something .... something else ...\n"
    "url=\"/transfer/packages/00000000-0000-0000-0000-000000000000/connectors/68f74d66-ca3d-4272-9b59-4f737946b3f7/something/138bb190-3b12-4855-88e2-0d1cdf46aeb5/...../...../...../...../....\"\n"
    "other things ...\n\n"
    "68f74d66-ca3d-4272-9b59-4f737946b300")

for str in re.findall(regex, test_str):
    print(re.findall(r"[A-Za-z0-9]{8}-(?:[A-Za-z0-9]{4}-){3}[A-Za-z0-9]{12}", str))

Выход

['00000000-0000-0000-0000-000000000000', '68f74d66-ca3d-4272-9b59-4f737946b3f7', '138bb190-3b12-4855-88e2-0d1cdf46aeb5']
1 голос
/ 15 апреля 2020

Из этого SO ответа :

Что касается второго вопроса, это общая проблема. Невозможно получить произвольное количество перехватов с помощью регулярного выражения PCRE, поскольку в случае повторных перехватов в групповом буфере сохраняется только последнее перехваченное значение. В результирующем массиве не может быть больше подсовпадений, чем количество групп захвата внутри шаблона регулярного выражения. Для получения дополнительной информации см. Повторяющаяся группа захвата или Захват повторенной группы.

...