python正则表达式-获取多行字符串中两个字符之间的所有内容(除了\n)
我有这样的文件作为输入:python正则表达式-获取多行字符串中两个字符之间的所有内容(除了\n),python,regex,Python,Regex,我有这样的文件作为输入: >X0 CUUGACGAUCA CGCAUCG >X55 UACGGCGG UUCAGC AUCG >X300 AAACCCGGGG 我需要得到'>'字符之间的行连接: CUUGACGAUCACGCAUCG UACGGCGGUUCAGCAUCG AAACCCGGGG 我的尝试是使用“re.match(r'^>*\n(.*)>*,a,re.DOTALL)”,然后从每个匹配中删除'\n',但正则表达式没有返回任何内容。我错在哪里 有些人在遇到问题时会想
>X0
CUUGACGAUCA
CGCAUCG
>X55
UACGGCGG
UUCAGC
AUCG
>X300
AAACCCGGGG
我需要得到'>'字符之间的行连接:
CUUGACGAUCACGCAUCG
UACGGCGGUUCAGCAUCG
AAACCCGGGG
我的尝试是使用“re.match(r'^>*\n(.*)>*,a,re.DOTALL)”
,然后从每个匹配中删除'\n',但正则表达式没有返回任何内容。我错在哪里
有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题杰米·扎温斯基
话虽如此,为什么不进行更容易理解的字符串处理呢
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序列。正则表达式对于此应用程序很有效,但要使用正则表达式执行此操作,您需要使用前瞻断言。这本质上意味着正则表达式查找但不使用前瞻(?=…)
中定义的内容,其中…
用于您的前瞻
因此,将其整合到一个完整的模式中,您将得到:
>(.+?)(?=>|$)
从中提取出来,这个模式寻找一个
作为起点,然后捕获所有内容,直到它看到另一个
或字符串的结尾,但是--这是关键--它不使用结尾的
,因此可以启动下一个实例
您还需要使用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']
有关更多正则表达式的详细信息,请参阅
如果不希望结果中出现换行符,则可以使用
string.replace
从列表中的每个项目中删除这些换行符。我只需执行以下操作:
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: