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)
两个变化:
re.compile(r"([A-Z0-9-_]+)_L\d{3}\.*")
- >
re.compile(r"([A-Z0-9-_]+)_L(\d{3})\.*")
match.group(1)
- >
match.group()
您的正则表达式模式仅匹配0046
/ 0047
部分。您制作了两个小组的新组,其中第二组与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'
答案 1 :(得分:0)
两种选择:
1)在预期的排序键周围添加parens ()
,如下所示:
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)