Python:用正则表达式从字符串中获取文件名

3

我有一个文件,其中的行看起来像这样:

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

(...)

我想创建一个正则表达式,用于获取每行的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)

问题在于文件名非常不规则。唯一的线索是:
- 以 .fa 结尾
- 在逗号后开始
谢谢。
2个回答

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
[\w|-] 字符类匹配一个单词字符 (\w),一个字面上的管道 | 或一个字面上的连字符 -。我认为你想要写成 [\w-] - Wiktor Stribiżew
@stribizhev 你是对的。感谢纠正!已更新答案以删除管道符号。 - Joe Young

0

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

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

说明

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

[\w-]+:这是在前瞻后被捕获的内容。它可以是一个或多个单词或“-”

\.fa:当满足所有条件时,匹配“.fa”


请查看你的正则表达式将匹配什么D160||||73_orphan_reads|||.fa153584000fa等。 - Wiktor Stribiżew
stribizhev,感谢您的纠正。那么您的意思是,前瞻或|不是必要的吗? - james jelo4kul
至少需要转义点,我不确定前瞻。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接