在python中的两个不同字符串之间提取int

时间:2016-02-23 12:51:28

标签: python regex

我有以下格式的字符串列表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', ...]

我想在intiter_之间提取.caffemodel并返回这些整数的列表。

经过一番研究后,我想出了这个解决问题的方法,但是我想知道是否有更优雅/ pythonic的方式来做,可能使用列表理解?

li = []
for f in files:
   tmp = re.search('iter_[\d]+.caffemodel', f).group()
   li.append(int(re.search(r'\d+', tmp).group()))

5 个答案:

答案 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']