регулярное выражение извлекает подстроки, соответствующие местоположению в данном шаблоне - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть серия шаблонных строк, которые определяют подстановки переменных с помощью {}.И замены могут принимать любые символы, но окружающая строка является фиксированной.

# 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}?Я знаю, что нет никакого реального способа, которым регулярное выражение может разделять две строки, но есть ли другие варианты?

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