我有以下格式的字符串列表files
:
files = ['/misc/lmbraid17/bensch/u-net-3d/2dcellnet/2dcellnet_v6w4l1/2dcellnet_v6w4l1_snapshot_iter_418000.caffemodel.h5',
'/misc/lmbraid17/bensch/u-net-3d/2dcellnet/2dcellnet_v6w4l1/2dcellnet_v6w4l1_snapshot_iter_502000.caffemodel.h5', ...]
我想在int
和iter_
之间提取.caffemodel
并返回这些整数的列表。
经过一番研究后,我想出了这个解决问题的方法,但是我想知道是否有更优雅/ pythonic的方式来做,可能使用列表理解?
li = []
for f in files:
tmp = re.search('iter_[\d]+.caffemodel', f).group()
li.append(int(re.search(r'\d+', tmp).group()))
答案 0 :(得分:3)
添加另一个可能的解决方案:将文件名一起加入一个大字符串(看起来像h5
的所有结尾,因此不存在创建不需要的匹配的危险)并使用re.findall
的是:
import re
li = [int(d) for d in re.findall(r'iter_(\d+)\.caffemodel', ''.join(files))]
答案 1 :(得分:2)
仅使用:
li = []
for f in files:
tmp = int(re.search('iter_(\d+)\.caffemodel', f).group(1))
li.append(tmp)
如果将表达式放入括号中,则会创建另一组匹配的表达式。
答案 2 :(得分:1)
您还可以使用lookbehind assertion:
regex = re.compile("(?<=iter_)\d+")
for f in files:
number = regex.search(f).group(0)
答案 3 :(得分:1)
列表理解的解决方案,如您所愿:
import re
re_model_id = re.compile(r'iter_(?P<model_id>\d+).caffemodel')
li = [int(re_model_id.search(f).group('model_id')) for f in files]
答案 4 :(得分:1)
没有正则表达式:
files = [
'/misc/lmbraid17/bensch/u-net-3d/2dcellnet/2dcellnet_v6w4l1/2dcellnet_v6w4l1_snapshot_iter_418000.caffemodel.h5',
'/misc/lmbraid17/bensch/u-net-3d/2dcellnet/2dcellnet_v6w4l1/2dcellnet_v6w4l1_snapshot_iter_502000.caffemodel.h5']
print([f.rsplit("_", 1)[1].split(".", 1)[0] for f in files])
['418000', '502000']
或者如果你想更具体:
print([f.rsplit("iter_", 1)[1].split(".caffemodel", 1)[0] for f in files])
但是你的模式似乎重复了,所以第一个解决方案可能就足够了。
您也可以使用find和rfind进行切片:
print( [f[f.find("iter_")+5: f.rfind("caffe")-1] for f in files])
['418000', '502000']