我有一个名为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)
答案 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)