【问题标题】:Regex to remove new lines up to a specific character正则表达式删除直到特定字符的新行
【发布时间】:2013-02-10 18:18:55
【问题描述】:

我在一个格式的文件中有一系列字符串:

>HEADER_Text1
Information here, yada yada yada
Some more information here, yada yada yada
Even some more information here, yada yada yada
>HEADER_Text2
Information here, yada yada yada
Some more information here, yada yada yada
Even some more information here, yada yada yada
>HEADER_Text3
Information here, yada yada yada
Some more information here, yada yada yada
Even some more information here, yada yada yada

我正在尝试找到一个正则表达式模式,它将删除下一个 > 字符之间的 > 字符下方的新行字符。所以最终的结果是这样的:

>HEADER_Text1
Information here, yada yada yada Some more information here, yada yada yada Even some more information here, yada yada yada
>HEADER_Text2
Information here, yada yada yada Some more information here, yada yada yada Even some more information here, yada yada yada
>HEADER_Text3
Information here, yada yada yada Some more information here, yada yada yada Even some more information here, yada yada yada

有谁知道我如何想出一个正则表达式模式来做到这一点?

旁注:这种格式在计算科学中作为 FASTA 格式很常见。

谢谢!

【问题讨论】:

  • 有很好的 FASTA 格式的 Python 解析器,你不需要自己实现。如果您从事基因组学,请考虑使用BioPython,如果您从事蛋白质组学,请考虑使用pyteomics(我开发的)。两者都可以很好地解析,但它们具有更多特定于字段的其他功能。

标签: python regex fasta


【解决方案1】:

如 cmets 中所述,最好的办法是使用现有的 FASTA 解析器。为什么不呢?

以下是我如何根据前导大于号加入行:

def joinup(f):
    buf = []
    for line in f:
        if line.startswith('>'):
            if buf:
                yield " ".join(buf)
            yield line.rstrip()
            buf = []
        else:
            buf.append(line.rstrip())
    yield " ".join(buf)

for joined_line in joinup(open("...")):
    # blah blah...

【讨论】:

    【解决方案2】:

    你不必使用正则表达式:

    [ x.startswith('>') and x or x.replace('\n','') for x in f.readlines()]    
    

    应该可以。

    In [43]: f=open('test.txt')
    
    In [44]: contents=[ x.startswith('>') and x or x.replace('\n','') for x in f.readlines()]                                                                                   
    
    In [45]: contents
    Out[45]: 
    ['>HEADER_Text1\n',
     'Information here, yada yada yada',
     'Some more information here, yada yada yada',
     'Even some more information here, yada yada yada',
     '>HEADER_Text2\n',
     'Information here, yada yada yada',
     'Some more information here, yada yada yada',
     'Even some more information here, yada yada yada',
     '>HEADER_Text3\n',
     'Information here, yada yada yada',
     'Some more information here, yada yada yada',
     'Even some more information here, yada yada yada']
    

    【讨论】:

    • 这似乎没有回答 OP 的问题,即加入不以 > 开头的行。
    • 如果你做一个简单的调整——让以 > 开头的行在那之前也有一个\n,然后加入并修剪它会回答 OP 的问题。
    【解决方案3】:

    这也应该有效。

    sampleText=""">HEADER_Text1 信息在这里,yada yada yada 更多信息在这里,yada yada yada 这里还有更多信息,yada yada yada

    HEADER_Text2 信息在这里,yada yada yada 更多信息在这里,yada yada yada 这里还有更多信息,yada yada yada HEADER_Text3 信息在这里,yada yada yada 更多信息在这里,yada yada yada 这里还有更多信息,yada yada yada""""

    cleartext = re.sub("\n(?!>)", "", sampleText)

    打印明文

    HEADER_Text1信息在这里,yada yada yadaSome more information here, yada yada yadaEven some more information here, yada yada yada HEADER_Text2这里有信息,yada yada yada这里有更多信息,yada yada yada这里还有更多信息,yada yada yada HEADER_Text3这里有信息,yada yada yada这里有更多信息,yada yada yada这里还有更多信息,yada yada yada

    【讨论】:

    • 鉴于您的答案格式很难确定您提出的答案是什么。
    【解决方案4】:

    鉴于 > 总是被认为是新行的第一个字符

    "\n([^>])" 与 "\1"

    【讨论】:

      【解决方案5】:

      你真的不想要正则表达式。而对于这项工作,python 和 biopython 是多余的。如果这实际上是 FASTQ 格式,只需使用 sed:

      sed '/^>/ { N; N; N; s/\n/ /2g }' file
      

      结果:

      >HEADER_Text1
      Information here, yada yada yada Some more information here, yada yada yada Even some more information here, yada yada yada
      >HEADER_Text2
      Information here, yada yada yada Some more information here, yada yada yada Even some more information here, yada yada yada
      >HEADER_Text3
      Information here, yada yada yada Some more information here, yada yada yada Even some more information here, yada yada yada
      

      【讨论】:

        猜你喜欢
        • 2022-07-26
        • 2011-07-03
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多