如何在Python中跳过匹配模式的行?

时间:2015-10-05 16:25:19

标签: python regex

我在test.fa中有以下几行:

#test.fa
>1
AGAGGGAGCTG
CCTCAGGGCTG
CACTCAGGAAA
TTGGGGCGCTG
AGCATGGGGGG
CAGGAGGGGCC

我需要忽略以“>”开头的行,并将以下行连接成一个单独的字符串。但是,以下脚本不仅会跳过包含“>”的行,也是连续剩余之前的下一行。

#!/usr/bin/env python
import sys
import re
string = ""
with open("test.fa","rt") as f:
       for line in f:
           if re.match(">",line):
              line = f.next()
           else:
              line = line.rstrip("\n")
              string = string + line
print (string)

任何人都可以帮忙修复脚本,或建议更好的方法吗?谢谢!!

3 个答案:

答案 0 :(得分:5)

无论如何,行计数器已经递增了每个循环,因此您实际上不需要在if块中执行任何操作。

   for line in f:
       if re.match(">",line):
          pass
       else:
          line = line.rstrip("\n")
          string = string + line

或者

   for line in f:
       if not re.match(">",line):
          line = line.rstrip("\n")
          string = string + line

其他增强功能:您不需要正则表达式来确定字符串的起始字符,并且通常建议在连接字符串时累积行中的行。

lines = []
for line in f:
    if not line.startswith(">"):
        lines.append(line.rstrip("\n"))
string = "".join(lines)

或者,作为一个班轮:

string = "".join(line.rstrip("\n") for line in f if not line.startswith(">"))

答案 1 :(得分:1)

你实际上是在调用line.next()两次,因为每次你循环,它都会得到下一行..我建议你去看看这个

#!/usr/bin/env python
import sys
import re
string = ""
with open("test.fa","rt") as f:
       for line in f:
           if not re.match(">",line)::
              line = line.rstrip("\n")
              string = string + line
print (string)

答案 2 :(得分:0)

您不需要

line = f.next()

在迭代器中自动发生。就这样做:

#!/usr/bin/env python
import sys
import re

string = ""
with open("test.fa","rt") as f:
    for line in f:
        if not re.match(">",line):
            line = line.rstrip("\n")
            string = string + line
print (string)