2014-12-04 234 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'] 
相关问题