我的文件包含如下所示的行:
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
- 在逗号后面开始
感谢
答案 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