【问题标题】:Extract int between two different strings in python在python中的两个不同字符串之间提取int
【发布时间】:2016-02-23 21:17:29
【问题描述】:

我有一个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', ...]

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

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

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

【问题讨论】:

  • 您需要使用捕获组。 r'iter_(\d+)\.caffemodel' 然后通过.group(1) 访问值。

标签: python regex


【解决方案1】:

只是添加另一种可能的解决方案:将文件名连接成一个大字符串(看起来全部以 h5 结尾,因此不存在创建不需要的匹配项的危险)并在其上使用 re.findall

import re
li = [int(d) for d in re.findall(r'iter_(\d+)\.caffemodel', ''.join(files))]

【讨论】:

  • 我喜欢你的解决方案...它非常易读(比我想出的更好;))
【解决方案2】:

只使用:

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

如果你把一个表达式放在括号中,它会创建另一组匹配的表达式。

【讨论】:

  • 为什么要使用惰性量词?这里是多余的。使用贪心版,效率更高。并逃脱点。并在声明正则表达式时使用原始字符串文字(只是最佳实践)。
  • 不错!我能够自己生成理解 li = [int(re.search('iter_(\d+)\.caffemodel', f).group(1)) for f in files] - 我不知道 ( ) 操作。谢谢:)
【解决方案3】:

您也可以使用lookbehind assertion

regex = re.compile("(?<=iter_)\d+")

for f in files:
     number = regex.search(f).group(0)

【讨论】:

    【解决方案4】:

    如您所愿,具有列表理解的解决方案:

    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]
    

    【讨论】:

      【解决方案5】:

      没有正则表达式:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-04
        • 2015-05-05
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 1970-01-01
        相关资源
        最近更新 更多