文件名匹配不分组

时间:2016-02-26 04:12:31

标签: python regex

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

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

2 个答案:

答案 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)