2014-12-05 64 views
1

我的問題與以下內容非常相似:How to get a Substring from list of file names。我是Python的新手,並且更喜歡Python(或R)的類似解決方案。我想查看一個目錄並從每個適用的文件名中提取一個特定的子字符串,並將其輸出爲矢量(首選),列表或數組。例如,假設我有以下文件名目錄:從Python或R中的文件名列表中提取子字符串

data_ABC_48P.txt 
data_DEF_48P.txt 
data_GHI_48P.txt 
other_96.txt 
another_98.txt 

我想引用目錄和提取下列作爲字符向量(對於R中使用)或列表:

"ABC", "DEF", "GHI" 

我試過如下:

from os import listdir 
from os.path import isfile, join 
files = [ f for f in listdir(path) if isfile(join(path,f)) ] 
import re 
m = re.search('data_(.+?)_48P', files) 

,但我得到了以下錯誤:

TypeError: expected string or buffer 

filestypelist

In [10]: type(files) 
Out[10]: list 

即使我最終想這個特徵向量作爲輸入R代碼裏面,我們試圖給我們所有的「腳本」的過渡到Python和使用[R僅用於數據分析,所以Python解決方案會很棒。我也使用Ubuntu,所以cmd行或bash腳本解決方案也可以工作。提前致謝!

回答

2

使用列表理解一樣,

[re.search(r'data_(.+?)_48P', i).group(1) for i in files if re.search(r'data_.+?_48P', i)] 

您需要遍歷列表內容序抓住你想要的字符串。

0

re.search需要字符串不列出。

使用

m=[] 
for line in files: 
    import re 
    m.append(re.search('data_(.+?)_48P', line).group(1)) 
+0

@AvinashRaj感謝名單了很多!!!!!! – vks 2014-12-05 17:27:34

0

re.search()不接受一個列表作爲參數,你需要使用一個循環,並通過每一個必須是字符串的功能元素,你可以使用positive look-around爲您預計字符串,則作爲re.search結果是你需要group發電機得到的字符串

>>> for i in files : 
... try : 
... print re.search(r'(?<=data_).*(?=_48P)', i).group(0) 
... except AttributeError: 
... pass 
... 
ABC 
DEF 
GHI 
0
from os import listdir 
from os.path import isfile, join 
import re 
strings = [] 
for f in listdir(path): 
    if isfile(join(path,f)): 
     m = re.search('data_(.+?)_48P', f) 
     if m: 
      strings.append(m.group(1)) 

print strings 

輸出:

['ABC', 'DEF', 'GHI'] 
0

在R:

list.files('~/desktop/test') 
# [1] "another_98.txt" "data_ABC_48P.txt" "data_DEF_48P.txt" "data_GHI_48P.txt" "other_96.txt" 

gsub('_', '', unlist(regmatches(l <- list.files('~/desktop/test'), 
           gregexpr('_(\\w+?)_', l, perl = TRUE)))) 
# [1] "ABC" "DEF" "GHI" 

另一種方式:

l <- list.files('~/desktop/test', pattern = '_(\\w+?)_') 

sapply(strsplit(l, '[_]'), '[[', 2) 
# [1] "ABC" "DEF" "GHI"