如何将此文本解析为 Python 中的 table?

How can I parse this text into a table in Python?

我有这个数据叫做 text.txt。我的代码也如下。我想提取行值并想用它制作 table 。我也想看看是否有更好的方法来做到这一点。谢谢

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)

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

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

解释:

  • [*]+ - 匹配一个或多个 * 字符
  • [ ]* - 匹配一个或多个 </code> (space) 字符</li> <li><code>([\w.]+) - 匹配文件名并计算为第一个paranthasis
  • [ \n]* - 匹配零个或多个 space 或换行符
  • [ :\w]+ - 匹配以 Seq
  • 开头的整行

正则获取序列的核心逻辑如下:

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

  • 首先将文件名与 ([\w.]+) 匹配后,我们使用 [ \n]*
  • 匹配 space(s) 和新行
  • 之后,如果你想解析你正在解析的序列的名称,你可能需要单独保留 [ \w]+:[ :\w]+ 并将其用作 ([ \w])+:[ :\w]+ paranthisis 可以匹配的地方你可以提取可以是 Seq_132582_1Seq_483974_49238,但是如果不考虑顺序,那么您可以简单地将其替换为 [ :\w]+[\n]* 并匹配整行并将下一行所需的数据与 [=27= 匹配]

另一个更简单的方法是提取数据如下所示,以在不使用 re 模块的情况下准备结果:

results = []
f = open("content.txt", 'r')

while True:
    line = f.readline()
    if not line:
        break
    file_name = line.split(":")[-1].strip()
    f.readline()  # skip line 
    data_seq1 = f.readline().strip()
    f.readline()  # skip line 
    data_seq2 = f.readline().strip()
    results.append((file_name, data_seq1, data_seq2))