我有这样的文件作为输入:
>X0
CUUGACGAUCA
CGCAUCG
>X55
UACGGCGG
UUCAGC
AUCG
>X300
AAACCCGGGG
我需要得到'>'之间的连线。字符:
CUUGACGAUCACGCAUCG
UACGGCGGUUCAGCAUCG
AAACCCGGGG
我的尝试是使用"re.match(r'^>.*\n(.*)>.*' ,a,re.DOTALL)"
,然后删除' \ n'从每场比赛,但正则表达式没有返回任何东西。我哪里错了?
答案 0 :(得分:1)
有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 - 杰米·扎温斯基
话虽如此,为什么不做这个更容易理解的字符串处理?
tmp = []
seqs = []
with open('txtfile') as f:
for line in f:
if line.startswith('>'):
seqs.append(''.join(tmp))
tmp = []
else:
tmp.append(line.strip())
else:
seqs.pop(0)
seqs.append(''.join(tmp))
或者,如果你真的想使用正则表达式,你可以尝试首先剥离换行符,然后按>X[digit]
模式进行拆分:
re.split(r'>X\d+', re.sub(r'\n', '', data))
但这有一个缺点,即整个文本文件必须加载到变量data
中,这对于大文件(在生物信息学中非常常见)并不那么有趣。所以,即便如此,首先给出的方法更有意思,因为你可以依次处理每个完成的DNA / RNA序列。
答案 1 :(得分:1)
我会简单地完成:
s = file.read() #or whatever string yu have
sar = "".join(s.split()) #this will remove newlines
sar = sar.split('>') #processing your splitter
for tstr in sar:
print tstr #this is the concatenation of lines between '>' characters:
答案 2 :(得分:0)
regex 适用于此应用程序,但要使用 regex 执行此操作,您需要使用前瞻断言。这实际上意味着 regex 会查找但不消耗前瞻(?=...)
中定义的内容,其中...
代表您正在展望的内容。
因此,将其整合到一个完整的模式中,你会得到这个:
>(.+?)(?=>|$)
提取这个,这个模式寻找一个>
作为起点,然后捕获所有内容,直到它看到另一个>
或字符串的结尾,但是 - 和这是关键 - 它不会消耗结尾>
,因此它可用于启动下一个实例。
您还需要使用DOTALL
标记来确保换行符与.
和findall
函数匹配,以返回所有匹配项。
所以,这样的事情会奏效:
#!/usr/env/python
import re
string = """>X0
CUUGACGAUCA
CGCAUCG
>X55
UACGGCGG
UUCAGC
AUCG
>X300
AAACCCGGGG"""
res = re.findall('>(.+?)(?=>|$)', string, re.DOTALL)
print "results: {0}".format(res)
输出结果为:
results: ['X0\nCUUGACGAUCA\nCGCAUCG\n', 'X55\nUACGGCGG\nUUCAGC\nAUCG\n', 'X300\nAAACCCGGGG']
有关更多正则表达式的详细信息,请参阅Python regex doc。
如果您不想在结果中添加换行符,则可以使用string.replace
从列表中的每个项目中删除这些换行符。