gpt4 book ai didi

regex - 如何对一个文件执行多个 re.sub()?

转载 作者:行者123 更新时间:2023-12-02 04:36:02 24 4
gpt4 key购买 nike

我正在尝试对一个文件执行多个正则表达式更改,但我不确定如何在保留以前的更改的同时执行此操作。我已经找到了几种方法来做到这一点,但我是编码新手,无法让它们在我的代码中工作。

import re
import sys

if len(sys.argv) != 3:
sys.exit('Error: One input and one output file is required')
fasta = open(sys.argv[1],'r')
output = open(sys.argv[2],'r+')

output1 = re.sub(r'^>\w+\|(\d+)\|.*LOXAF.*', r'>Loxodonta africana, \1, MW =',fasta)
output2 = re.sub(r'^>\w+\|(\d+)\|.*DUGDU.*', r'>Dendrohyrax dorsalis, \1, MW =',output1)
output3 = re.sub(r'(^[A-Z].*)\n', r'\1',output2)
print(output3)

理想情况下,我会将所有正则表达式写入输出文件,而不仅仅是打印它。我在下面举了一个我想做的改变的例子(为了简单起见,我减少了序列的数量和长度)。

>gi|75074720|sp|Q9TA19.1|NU5M_LOXAF RecName: Full=NADH-ubiquinone oxidoreductase chain 5; AltName: Full=NADH dehydrogenase subunit 5
MKVINLIPTLMLTSLIILTLPIITTLLQNNKTNCFLYITKTAVTYAFAISLIPTLLFIQSNQEAYISNWH
WMTIHTLKLSMSFKLDFFSLTFMPIALFITWSIM

>gi|75068112|sp|Q9TA29.1|NU1M_LOXAF RecName: Full=NADH-ubiquinone oxidoreductase chain 1; AltName: Full=NADH dehydrogenase subunit 1
MFLINVLTVTLPILLAVAFLTLVERKALGYMQLRKGPNVVGPYGLLQPIADAIKLFTKEPIYPQTSSKFL
FTVAPILALTLALTVWAPLPMPYPLINLNLSL

>gi|24418335|sp|Q8W9N2.1|ATP8_DUGDU RecName: Full=ATP synthase protein 8; AltName: Full=A6L; AltName: Full=F-ATPase subunit 8
MPQLDTTTWFITILSMLITLFILFQTKLLNYTYPLNALPISPNVTNHLTPWKMKWTKTYLPLSLPLQ

输出:

>Loxodonta africana, 75074720, MW =
MKVINLIPTLMLTSLIILTLPIITTLLQNNKTNCFLYITKTAVTYAFAISLIPTLLFIQSNQEAYISNWHWMTIHTLKLSMSFKLDFFSLTFMPIALFITWSIM
>Loxodonta africana, 75068112, MW =
MFLINVLTVTLPILLAVAFLTLVERKALGYMQLRKGPNVVGPYGLLQPIADAIKLFTKEPIYPQTSSKFLFTVAPILALTLALTVWAPLPMPYPLINLNLSL
>Dendrohyrax dorsalis, 24418335, MW =
MPQLDTTTWFITILSMLITLFILFQTKLLNYTYPLNALPISPNVTNHLTPWKMKWTKTYLPLSLPLQ

感谢您的帮助!

最佳答案

fasta 文件可能非常大。将整个文件加载到变量中不是一个好主意。我建议逐行工作(减少内存使用量)。

fasta 文件是一种格式文件,而不是纯文本文件,因此理解和使用这种格式将帮助您提取所需的信息,而无需使用 3 个盲目正则表达式替换。

建议:

import re
import sys
from itertools import takewhile

if len(sys.argv) != 3:
sys.exit('Error: One input and one output file is required')

with open(sys.argv[1], 'r') as fi, open(sys.argv[2], 'r+') as fo:
species = {
'LOXAF': 'Loxodonta africana',
'DUGDU': 'Dendrohyrax dorsalis'
}

sep = re.compile(r'[|_ ]');
recF = ">{}, {}, MW =\n{}"

def getSeq(f):
return ''.join([line.rstrip() for line in takewhile(lambda x: x!="\n", f)])

for line in fi:
if line.startswith('>'):
parts = sep.split(line, 6)
print(recF.format(species[parts[5]], parts[1], getSeq(fi)), file=fo)

关于regex - 如何对一个文件执行多个 re.sub()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42612524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com