正则表达式提取与给定模式中的位置匹配的子字符串

2024-04-27 00:13:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一系列用{}定义变量替换的模板字符串。替换可以使用任何字符,但是周围的字符串是固定的。你知道吗

# 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}等案件的最佳方式是什么?我知道regex无法真正将两个字符串分开,但还有其他选择吗?你知道吗


Tags: the字符串txt模板示例templatefilepattern