我有一个名称为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)
答案 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