2014-12-04 5 views
0

저는 정규 표현식에서 매우 좋지 않습니다. 파일 이름을 기반으로 폴더에서 파일을 찾으려고합니다. 대부분의 파일 이름은 GSE1234_series_matrix.txt 형식이므로 os.path.join("files", GSE_num + "_series_matrix.txt")을 사용하고 있습니다. 그러나 일부 파일의 이름은 GSE1234-GPL22_series_matrix.txt입니다. GSE 번호로 시작하고 _series_matrix.txt와 함께 끝나는 모든 파일을 처리하는 방법을 한 문장으로 요약 할 수 있을지 모르겠습니다. 나는 정말 어떤 도움을 주셔서 감사합니다.Regex Python에서 폴더의 모든 파일과 일치하도록

EDIT - 폴더에 이러한 일련의 매트릭스 텍스트 파일이 있는데, 경로 결합을 사용하여 경로를 언급합니다. 또한 모든 GSE 번호가있는 텍스트 파일을 입력했습니다. 이렇게하면 선택한 GSE 번호에 대해서만 스크립트가 실행됩니다. 따라서 폴더에있는 모든 항목이 GSE num 목록에있는 것은 아니며 목록에는 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

+0

name.startswith ("GSE") 및 name.endswith ("_ series_matrix.txt")]'가 있으면 파일 이름에 good_filenames = [os.path.join ("files", name)을 사용할 수 있습니다. 나는 당신이 무엇을하려고하는지 100 % 확신하지 못합니다. – Kevin

+0

그것은'TypeError : 유니 코드로 강제 변환 : 문자열 또는 버퍼가 필요합니다. 목록을 찾았습니다. ' – abn

1

케빈의 대답은 훌륭합니다! 당신이 정규식을 사용하려는 경우, 당신은 같은 것을 할 수 있습니다

^GSE\d+.*series_matrix.txt$ 

GSE와 숫자로 시작하고, series_matrix.txt로 끝나는 아무것도 일치합니다 그

+0

re.findall을 사용해야합니까? path join 문에서 어떻게 사용할 수 있는지 이해하지 못합니다. – abn

+0

re.match를 사용하여 원하는 이름 (예 : re.match 인 경우 파일 이름에 [os.path.join ("files", name) r "GSE \ d +. * series_matrix \ .txt $", name)]. – MRAB

+0

'os.listdir'을 사용하여 디렉토리의 모든 파일을 나열하고 싶을 수도 있습니다. 이것은 Kevin이 제안한 것과 유사합니다 : 'for i for os.listdir ("./ files") : re.search ('^ GSE \ d +. * series_matrix.txt $', i)' ' – fdisk

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'] 
관련 문제