У меня есть серия шаблонных строк, которые определяют подстановки переменных с помощью {}.И замены могут принимать любые символы, но окружающая строка является фиксированной.
# template string pattern
file{a}-{b}stuff.txt
# final string after substitution
fileDR-v1.0stuff.txt
Учитывая пример строки, я хочу иметь возможность извлечь, какие части являются переменными, которые были заменены.Например, для «fileDR-v1.0stuff.txt» он должен вернуть {'a': 'DR', 'b': 'v1.0'}.Я могу заставить его работать в основном, создав шаблон регулярного выражения из шаблона, заменив все содержимое в квадратных скобках группой регулярных выражений (. *) Для захвата всех символов.
template = "file{a}-{b}stuff.txt"
example = "fileDR-v1.0stuff.txt"
# escape any periods in the pattern
subtemp = template.replace('.','\.')
# create the regex pattern
pattern = re.sub('{(.*?)}', '(.*)', subtemp)
print(pattern)
'file(.*)-(.*)stuff.txt'
# perform the search using the pattern on both the template and example
pmatch = re.search(pattern, template)
tmatch = re.search(pattern, example)
pmatch.groups()
('{a}', '{b}')
tmatch.groups()
('DR', 'v1.0')
Из групп я могу извлечь ключи и значения и воссоздать отображение a = 'DR', b = 'v1.0'.Однако у меня возникают проблемы с извлечением правильных строк для шаблонов, имеющих квадратные скобки.Существует ли правильный синтаксис для обработки этих крайних случаев?
Примеры шаблонов, которые у меня есть
'{a}.{b}'
'{dr}Q/{dr}Q.fits'
'parts_{dr}{version}_{sample}_{ns}.fits.gz'
'path/{ver}/{plate}/stack/file-{plate}-{ifu}-LOG.fits.gz'
И примеры строк
'mask.html'
'DR10Q/DR10Q.fits'
'parts_DR12v1.0_1_n.fits.gz'
'path/v2_4_3/8000/stack/file-8000-191-LOG.fits.gz'
Мой текущий шаблон (. *) и экранирование .
работает в большинстве случаев.Если я запускаю приведенный выше код на этих 4 примерах, я получаю
('{a}', '{b}')
('mask', 'html')
----
('{dr}', '{dr}')
('DR10', 'DR10')
----
('{dr}{version}', '', '{sample}', '{ns}')
('DR12v1.0', '', '1', 'n')
----
('{ver}', '{plate}', '{plate}', '{ifu}')
('v2_4_3', '8000', '8000', '191')
----
Каков наилучший способ обработки таких случаев, как {dr}{version}
или {a}{b}
?Я знаю, что нет никакого реального способа, которым регулярное выражение может разделять две строки, но есть ли другие варианты?