从文件名中提取的名称字符串,并将其存储在一个变量在Python

问题描述:

我有他的名字,我能够成功地读取和存储在一个变量tar文件,从文件名中提取的名称字符串,并将其存储在一个变量在Python

tarname = 'esarchive--Mona-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05222017-4.tar' 

但我怎么只提取“Mona”从这个文件名中存储在一个变量中?

(tar文件的文件名结构与上述名称相同,名称在“es-archive - {Name} -AB”之后出现,因此解决方案返回任何名称都符合此条件的名称格式)

谢谢!

+0

可以将名字包括破折号?如果没有,我会试着用'tarname.split(' - ')[2]'。 –

+0

我们需要关于您可能遇到的一组可能的文件名的更多信息来回答这个问题。 –

+0

这个名字应该是一个简单的名字,像你的和我的,但是它之前和之后的破折号是我为各种人收到的原始文件的一部分。就像--Jamy-AB –

>>> import re 
>>> tarname = "esarchive--Mona-AB-Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05222017-4.tar" 
>>> s = re.match("esarchive--(\w+)-AB", tarname).group(1) 
>>> s 
'Mona' 
+0

真的很有帮助。用我现有的代码工作就像一个魅力! –

我能想到的最简单的方法:

  1. 拆分对-字符的文件名。
  2. 从结果列表中获取第3项(索引2)。

在代码:

filename.split('-')[2] 

简单的一行。这当然是你的榜样。我需要更多的示例文件名来解释可能的变化,并且确定它是否会始终有效。

+0

这种方法的问题是,如果数据并不总是完全如预期的那样,那么您可能会得到一个不正确的结果(默默地说,当您希望有某种未处理的异常提升时) – wim

parse模块很适合这种东西。你可以把它想成str.format的倒数。

from parse import parse 
pattern = 'esarchive--{Name}-AB-{otherstuff}.tar' 
result = parse(pattern, tarname) 

演示:

>>> result = parse(pattern, tarname) 
>>> result['Name'] 
'Mona' 
>>> result.named 
{'Name': 'Mona', 
'otherstuff': 'Test226-8037affd-06d1-4c61-a91f-816ec9cb825f-05222017-4'} 
+0

一般使用的最佳答案。 – stybl

+0

谢谢!这样好的解决方案 –