Захват нескольких подстрок в одной группе - PullRequest
0 голосов
/ 22 марта 2019

Теперь у меня путь к папке будет содержать имя таблицы базы данных и идентификатор, похожий на:

path = '/something/else/TableName/000/123/456/789'

Конечно, я могу сопоставить TableName/000/123/456/789, а затем разделить их по сценарию Python.

import re
matched = re.findall(r'.*?/(\w+(?:/\d+){4})', path)[0]  # TableName/000/123/456/789
split_text = matched.split('/')  # ['TableName', '000', '123', '456', '789']
table_name = split_text[0]  # 'TableName'
id = int(''.join(split_text[1:]))  # 123456789

* / (\ W + (?: / \ D +) {4}). * +1009 *

Но я хочу знать, может ли какая-либо функция, предоставляемая регулярным выражением, завершить ее за один шаг? Я пробовал эти способы:

re.match(r'.*?/(?P<table_name>\w+)(?:/(?P<id>\d+)){4}', path).groupdict()  # {'table_name': 'TableName', 'id': '789'}
re.split(r'.*?/(\w+)(?:/(\d+)){4}', path)  # ['', 'TableName', '789', '']
re.sub(r'(.*?/)\w+(?:(/)\d+){4}', '', path)  # '', full string has been replaced

* /.? (Р \ W +?) (?:? / (Р \ д +)) {4}

* / (\ W +).? (?: / (\ D +)) {4} * * 1 021

Есть еще что-нибудь? Или я должен использовать скрипт Python выше? Я надеюсь, что результат будет {'table_name': 'TableName', 'id': '000123456789'} или ('TableName', '000123456789'), по крайней мере ('TableName', '000', '123', '456', '789').

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Самый простой способ - избежать использования квантификатора:

re.findall('(\w+)\/(\d+)\/(\d+)\/(\d+)\/(\d+)', path)

[('TableName', '000', '123', '456', '789')]
0 голосов
/ 22 марта 2019

Самый простой способ - расширить группу.

>>> match=re.search(r'.*?/(\w+)(?:/(\d+))(?:/(\d+))(?:/(\d+))(?:/(\d+))',a)
>>> match.groups()
('TableName', '000', '123', '456', '789')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...