2016-02-26 97 views
0
import zipfile 
from collections import defaultdict 
from pprint import pprint 
import re 
from glob import glob 


filenames = glob("/batch3/*C*_paired_fastqc.zip") 


pattern = re.compile(r"([A-Z0-9-_]+)_L\d{3}\.*") 
grouped = defaultdict(list) 

for filename in filenames: 
    match = pattern.search(filename) 
    if match: 
     key = match.group(1) 
     grouped[key].append(filename) 

pprint(grouped) 

for i, g in enumerate(sorted(grouped.keys())): 
    for f in grouped[g]: 
     print f 

    print "--------" 

輸出:文件名匹配不組

/batch3/0046-CL7_S7_L003_R1_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L001_R1_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L002_R2_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L003_R2_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L004_R2_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L001_R2_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L002_R1_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L004_R1_001_output_paired_fastqc.zip 
-------- 
/batch3/0047-CLI_S8_L002_R1_001_output_paired_fastqc.zip 
/batch3/0047-CLI_S8_L004_R2_001_output_paired_fastqc.zip 
/batch3/0047-CLI_S8_L002_R2_001_output_paired_fastqc.zip 
/batch3/0047-CLI_S8_L003_R2_001_output_paired_fastqc.zip 
/batch3/0047-CLI_S8_L004_R1_001_output_paired_fastqc.zip 
/batch3/0047-CLI_S8_L001_R2_001_output_paired_fastqc.zip 
/batch3/0047-CLI_S8_L003_R1_001_output_paired_fastqc.zip 
/batch3/0047-CLI_S8_L001_R1_001_output_paired_fastqc.zip 

不過,我想有:

/batch3/0046-CL7_S7_L001_R1_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L001_R2_001_output_paired_fastqc.zip 
--------- 
/batch3/0046-CL7_S7_L002_R1_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L002_R2_001_output_paired_fastqc.zip 
--------- 
/batch3/0046-CL7_S7_L003_R1_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L003_R2_001_output_paired_fastqc.zip 
--------- 
/batch3/0046-CL7_S7_L004_R1_001_output_paired_fastqc.zip 
/batch3/0046-CL7_S7_L004_R2_001_output_paired_fastqc.zip 

不幸的是,我無法弄清楚如何匹配文件名。

+0

你所需的輸出不會出現你輸入對應。你試圖完成什麼? –

+0

您的輸出結果不正確......它具有多個相同的文件名。看起來你正在分組在S7,S8等......當你想要L001,L002等時,所以正則表達式選擇了錯誤的部分。嘗試''_L \ d {3} _「'來代替。 – tdelaney

+0

是的,修復輸出 – user977828

回答

0

兩個變化:

  • re.compile(r"([A-Z0-9-_]+)_L\d{3}\.*") - > re.compile(r"([A-Z0-9-_]+)_L(\d{3})\.*")
  • match.group(1) - > match.group()

你的正則表達式匹配了只0046/一部分。新的一個你做了兩個組,第二個匹配L001/L002部分。該.group()方法的行爲與這個新模式的一些例子:

pattern.search(filenames[0]).group() 
'0046-CL7_S7_L003' 
pattern.search(filenames[0]).group(1) 
'0046-CL7_S7' 
pattern.search(filenames[0]).group(2) 
'003' 
+0

不幸的是,它不起作用 – user977828

+0

它在這裏使用在你的例子中的16個文件名工作。確保你已經做了上面的兩個更改。 Robᵩ的其他答案與我的非常相似,應該也可以工作。 –

0

兩個選擇:

1)加括號()在你的意圖排序的關鍵,就像這樣:

pattern = re.compile(r"(([A-Z0-9-_]+)_L\d{3})") 

注意附加括號。

現在match.groups()看起來像:('0046-CL7_S7_L003', '0046-CL7_S7'),你可以使用match.group(1)排序。

2)讓你的正則表達式相同,但使用match.group(0)您的排序:

key = match.group(0) 
+0

不幸的是,它不起作用 – user977828

+0

你能更具體嗎?它在我的測試中運行良好。 –