2016-02-26 93 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

你能更具体吗?它在我的测试中运行良好。 –