Python,用于在字符串中获取文件名的正则表达式

时间:2015-09-20 14:57:10

标签: python regex

我的文件包含如下所示的行:

chr5    153584000   153599999   D16073_orphan_reads.fa;709[F18|R11] unkn    1   unkn    2509

chr7    153764000   153775999   D16073_orphan_reads.fa;710[F9|R21],14892_orphan_reads.fa;229[F19|R16]   unkn        1   unkn    2510

chr3    127848000   127871999   B15971_orphan_reads.fa;172[F35|R6],D16157-14_orphan_reads.fa;183[F6|R13],14892_orphan_reads.fa;229[F19|R16],USP19283_orphan_reads.fa;336[F10|R6],D15927-14_orphan_reads.fa;176[F11|R10],1007,1007   46  1007    1658

(...)

我想创建一个Regex,它为每一行提取fasta文件(.fa)名称(有时我每行有多个文件)。

我想最终得到类似的东西:

D16073_orphan_reads.fa

D16073_orphan_reads.fa, 14892_orphan_reads.fa

B15971_orphan_reads.fa, D1615714_orphan_reads.fa, 14892_orphan_reads.fa,USP19283_orphan_reads.fa, D15927-14_orphan_reads.fa

我试过了:

 pattern= re.search(".+.[.fa]", line)

问题是文件名的名称非常不规则。唯一的线索是:

-end with .fa

- 在逗号后面开始

感谢

2 个答案:

答案 0 :(得分:1)

re.findall()调用中使用的正则表达式([\w-]+\.fa);将实现此目的。

import re

data = '''chr5    153584000   153599999   D16073_orphan_reads.fa;709[F18|R11] unkn    1   unkn    2509

chr7    153764000   153775999   D16073_orphan_reads.fa;710[F9|R21],14892_orphan_reads.fa;229[F19|R16]   unkn        1   unkn    2510

chr3    127848000   127871999   B15971_orphan_reads.fa;172[F35|R6],D16157-14_orphan_reads.fa;183[F6|R13],14892_orphan_reads.fa;229[F19|R16],USP19283_orphan_reads.fa;336[F10|R6],D15927-14_orphan_reads.fa;176[F11|R10],1007,1007   46  1007    1658
'''

for line in data.splitlines():
    filenames = re.findall('([\w|-]+\.fa);', line)
    if filenames:
        print ', '.join(filenames)

输出:

D16073_orphan_reads.fa
D16073_orphan_reads.fa, 14892_orphan_reads.fa
B15971_orphan_reads.fa, D16157-14_orphan_reads.fa, 14892_orphan_reads.fa, USP19283_orphan_reads.fa, D15927-14_orphan_reads.fa

答案 1 :(得分:0)

尝试此模式((?=\w+)[\w-]+\.fa)

在此处查看演示https://regex101.com/r/uJ0vD4/3

<强>解释

(?=\w+):检查是否有一个或多个单词,如果是,则匹配。

[\w-]+:这就是前瞻之后所捕获的内容。一个或多个单词或 -

\.fa:在满足所有条件后匹配.fa