Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python正则表达式-获取多行字符串中两个字符之间的所有内容(除了\n)_Python_Regex - Fatal编程技术网

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: