更正python正则表达式来创建双dict

时间:2016-04-29 17:09:11

标签: python regex

我有一个名称为name_x01_y01_000.h5或name_y01_x01_000.h5的文件列表

创建列表的正确正则表达式(或其他方法)是什么: file,x_ind,y_ind

到目前为止,我有这段代码:

name = 'S3_FullBrain_Mosaic_'
type = '.h5'

wildc = name + '*' + type
files = glob.glob(wildc)
files = np.asarray(files)

wildre = 'r\"' +name+'x(?P<x_ind>\d+)_y(?P<y_ind>\d+).+\"'
m = re.match(wildre,files)

2 个答案:

答案 0 :(得分:1)

由于glob已经确保了正确的文件名和扩展名,因此正则表达式只需匹配索引。 re.search允许部分匹配。 .groupdict创建一个包含命名组作为键的字典。 file密钥可以手动处理。

>>> file = 'S3_FullBrain_Mosaic_x02_y05_abcd.h5'
>>> result = re.search(r'x(?P<x_ind>\d+)_y(?P<y_ind>\d+)', file).groupdict()
>>> result
{'y_ind': '05', 'x_ind': '02'}
>>> result['file'] = file
>>> result
{'y_ind': '05', 'file': 'S3_FullBrain_Mosaic_x02_y05_abcd.h5', 'x_ind': '02'}

您可以遍历文件以生成dicts列表。为此,不需要创建一个numpy数组,因为我怀疑你将在files列表上进行任何繁重的数值计算。

要处理这两种可能的格式,您需要使用两个正则表达式调用re.search。一个将返回None,另一个匹配您可以使用groupdict

答案 1 :(得分:1)

您可以使用re.findall

import re

names = ['name_x01_y01_000.h5', 'name_y01_x01_000.h5']
for name in names:
    matches = re.findall(r'_([xy])(\d+)(?=_)', name)
    d = {k: int(v) for k, v in matches}
    d['name'] = name