如何将这些文本解析为Python表?

时间:2018-10-31 15:25:21

标签: python text-parsing

我有一个名为text.txt的数据。我在下面也有我的代码。我想提取线值,并要用它做成一张桌子。我还想看看是否有更好的方法可以做到这一点。谢谢

test.txt

Counting********************File:  bbduk_trimmed_Ago2_SsHV2L_1_CATGGC_L003_R1_001
Seq_132582_1: ATCCGAATTAGTGTAGGGGTTAACATAACTCT: 
0
Seq_483974_49238: TCCGAATTAGTGTAGGGGTTAACATAACTC: 
73764
Counting********************File:  bbduk_trimmed_Ago2_SsHV2L_2_CATTTT_L003_R1_001
Seq_132582_1: ATCCGAATTAGTGTAGGGGTTAACATAACTCT: 
0
Seq_483974_49238: TCCGAATTAGTGTAGGGGTTAACATAACTC: 
78640
Counting********************File:  bbduk_trimmed_Ago2_VF_1_CAACTA_L003_R1_001.fastq
Seq_132582_1: ATCCGAATTAGTGTAGGGGTTAACATAACTCT: 
0
Seq_483974_49238: TCCGAATTAGTGTAGGGGTTAACATAACTC: 
26267

我想要的结果:

  File Name                                 Seq_132582_1  Seq_483974_49238
0  bbduk_trimmed_Ago2_SsHV2L_1_CATGGC_L003_R1_001     0      73764
1  bbduk_trimmed_Ago2_SsHV2L_2_CATTTT_L003_R1_001     0      78640
2  bbduk_trimmed_Ago2_VF_1_CAACTA_L003_R1_001.fastq   0      26267

我尝试过的代码:

import sys

if sys.version_info[0] < 3:
    raise Exception("Python 3 or a more recent version is required.")
import re
import pandas as pd
text = open("text.txt",'r').read()
print(type(text))
results = re.findall(r'(bbduk_trimmed.*.fastq)\nSeq_132582_1: ATCCGAATTAGTGTAGGGGTTAACATAACTCT: \n(\d)\nSeq_483974_49238: TCCGAATTAGTGTAGGGGTTAACATAACTC: \n(\d*)',text)
df=pd.DataFrame(results)
# df.columns=['FileName','Seq_132582_1','Seq_483974_49238'] #This doesn't work
print(df)

2 个答案:

答案 0 :(得分:1)

只需将您的正则表达式替换为以下代码行:

re.findall(r'Counting[*]+File:[ ]*([\w.]+)[ \n]*[ :\w]+[\n]*(\w+)[\n]*[ :\w]+[\n]*(\w+)', text)

说明:

  • [*]+-匹配一个或多个*字符
  • [ ]*-匹配一个或多个(空格)字符
  • ([\w.]+)-匹配文件名并计算为第一方括号
  • [ \n]*-匹配零个或多个空格或换行符
  • [ :\w]+-匹配以Seq开头的整行

在正则表达式中获取序列的核心逻辑如下:

([\w.]+)[ \n]*[ \w]+:[ :\w]+[\n]*(\w+)

  • 首先用([\w.]+)匹配文件名,然后使用[ \n]*匹配空格和换行,
  • 之后,如果要解析要解析的序列名称,则可能需要单独保存[ \w]+:[ :\w]+并将其用作([ \w])+:[ :\w]+,在这里paranthisis可以匹配,您可以提取{{1 }}或Seq_132582_1,但是如果不考虑顺序,则可以简单地将其替换为Seq_483974_49238,然后将整行匹配,并用[ :\w]+[\n]* < / li>

另一种更简单的方法是在不使用(\w+)模块的情况下提取数据以准备结果:

re

答案 1 :(得分:0)

对于您的特定文本文件,您可以这样解析它:

text = re.sub(':\s\n', ':', text)  # normalize lines

lines = []
lines = text.split('\n')

i = 0
table_rows = []

while (i < len(lines)):

    table_rows.append([str(lines[i].split(':')[1]).strip(),
                       str(lines[i+1].split(':')[2]).strip(),
                       str(lines[i+2].split(':')[2]).strip()])

    i+=3


df = pd.DataFrame(table_rows)

df = df.rename({0:'File Name',
                1:str(lines[1].split(':')[0]).strip(),
                2:str(lines[2].split(':')[0]).strip()}, axis=1)