2014-12-04 97 views
0

我在正則表達式中很糟糕。 我試圖根據文件名找到文件夾中的文件。大多數文件名格式爲GSE1234_series_matrix.txt,因此我一直在使用os.path.join("files", GSE_num + "_series_matrix.txt")。但是,一些文件的名稱如GSE1234-GPL22_series_matrix.txt。我不知道如何處理所有以GSE編號開始並以_series_matrix.txt結尾的文件,可能只有一個聲明。我非常感謝任何幫助。Python中的正則表達式匹配文件夾中的所有文件

編輯 - 我有這些系列矩陣文本文件在一個文件夾中,爲此我提到使用路徑連接的路徑。我還輸入了一個文本文件,其中包含所有GSE編號。這樣它僅對選定的GSE號碼運行腳本。因此,不是文件夾中的所有內容都位於GSE編號列表中,而列表中只有GSE編號而不是GPL。例如,文件GSE1234-GPL22_series_matrix.txt在列表中是GSE1234。

回答

4

完全跳過使用正則表達式。

good_filenames = [name for name in filenames if name.startswith("GSE") and name.endswith("_series_matrix.txt")] 
+0

謝謝!我有個問題。這給了我一個清單。我需要單獨的文件名或換句話說,我如何將它合併到os.path.join語句中? – abn 2014-12-04 19:33:24

+0

我猜如果name.startswith(「GSE」)和name.endswith(「_ series_matrix.txt」))''你可以在文件名中爲'name_filenames = [os.path.join(「files」,name)我不是100%確定你想要做什麼。 – Kevin 2014-12-04 19:35:49

+0

它給了我'TypeError:脅迫Unicode:需要字符串或緩衝區,找到列表' – abn 2014-12-04 19:38:02

1

凱文的回答非常好!如果你想使用正則表達式,你可以做這樣的事情:

^GSE\d+.*series_matrix.txt$ 

這將匹配任何與GSE和數字開頭,並與series_matrix.txt結束

+0

我應該使用re.findall嗎?我不明白我怎麼可以在路徑連接語句中使用 – abn 2014-12-04 19:34:36

+0

使用re.match來標識你想要的名字,例如[os.path.join(「files」,name)爲文件名中的名字,如果re.match r「GSE \ d +。* series_matrix \ .txt $」,name)]。 – MRAB 2014-12-04 19:49:45

+0

也許你想用'os.listdir'列出目錄中的所有文件。這與Kevin的建議類似: '我在os.listdir(「./ files」)中:' 're.search('^ GSE \ d +。* series_matrix.txt $',i)' ' – fdisk 2014-12-04 19:51:09

0

你可以使用水珠。根據模式中包含多少路徑,您根本不必擔心使用os.path.join

import glob 
good_filenames = glob.glob('/your/path/here/GSE*_series_matrix.txt') 

回報:

['/your/path/here/GSE1234_series_matrix.txt', 
'/your/path/here/GSE1234-GPL22_series_matrix.txt'] 
相關問題