Python регулярное выражение извлекает подстроки из шаблона - PullRequest
0 голосов
/ 10 марта 2020

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

file_path = "/101-001-015_fg01/4312x2156/101-001-015_fg01.0001.exr"
file_template = "/{CODE}_{ELEMENT}/{WIDTH}x{HEIGHT}/{CODE}_{ELEMENT}.{FRAME}.exr"

Вывод, который я ищу, следующий :

{
    "CODE": "101-001-015",
    "ELEMENT": "fg01",
    "WIDTH": "4312",
    "HEIGHT: "2156",
    "FRAME": "0001"
}

Мой первоначальный подход состоял в том, чтобы отформатировать мой шаблон и найти все совпадения, но это не идеально:

import re
re_format = file_template.format(SHOT='(.*)', ELEMENT='(.*)', WIDTH='(.*)', HEIGHT='(.*)', FRAME='(.*)')
search = re.compile(re_format)
result = search.findall(file_path)
# result: [('101-001-015', 'fg01', '4312', '2156', '101-001-015', 'fg01.000', '')]

Все ключи шаблона могут содержать различные символы и состоять из различной длины, поэтому я ищу хороший алгоритм сопоставления. Любые идеи, если и как это можно сделать с помощью Python re или каких-либо альтернативных библиотек?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Я бы go для назвал группы захвата и извлекал бы желаемые результаты с помощью функции groupdict():

import re

file_path = "/101-001-015_fg01/4312x2156/101-001-015_fg01.0001.exr"
rx = r"\/(?P<CODE>.+)_(?P<ELEMENT>.+)\/(?P<WIDTH>.+)x(?P<HEIGHT>.+)\/.+\.(?P<FRAME>\w+).exr"
m = re.match(rx, file_path)

result = m.groupdict()
# {'CODE': '101-001-015', 'ELEMENT': 'fg01', 'WIDTH': '4312', 'HEIGHT': '2156', 'FRAME': '0001'}

1 голос
/ 10 марта 2020

Вид похож на Саймон , я тоже попробую с именованной захваченной группой

import re
regex = r"(?P<CODE>[0-9-]+)_(?P<ELEMENT>[0-9a-z]+)\/(?P<WIDTH>[0-9]+)x(?P<HEIGHT>[0-9]+)\/\1_\2\.(?P<FRAME>[0-9]+)\.exr"
test_str = "101-001-015_fg01/4312x2156/101-001-015_fg01.0001.exr"
matches = re.match(regex, test_str)
print(matches.groupdict())

DEMO: https://rextester.com/BEZH21139

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...