python regex-获取多行字符串中两个字符之间的所有内容(除了\ n)

时间:2014-12-06 01:16:08

标签: python regex

我有这样的文件作为输入:

>X0
CUUGACGAUCA
CGCAUCG
>X55
UACGGCGG
UUCAGC
AUCG
>X300
AAACCCGGGG

我需要得到'>'之间的连线。字符:

CUUGACGAUCACGCAUCG
UACGGCGGUUCAGCAUCG
AAACCCGGGG

我的尝试是使用"re.match(r'^>.*\n(.*)>.*' ,a,re.DOTALL)",然后删除' \ n'从每场比赛,但正则表达式没有返回任何东西。我哪里错了?

3 个答案:

答案 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从列表中的每个项目中删除这些换行符。