У меня проблема с регулярным выражением со строковым шаблоном, который я использовал для извлечения из них данных, разбивая его.
Я использую Python.
Строковые строки в упрощенном виде выглядят примерно так (есть между ними несколько строк, но это проблематично):
Название соединения,RT,Score\n2,4,6-Циклогептатриен- 1-он, 3,5-бис-триметилсилил-,8,705,626,Площадь,386902,453,tR (мин),8,705
['Название соединения', 'RT ', 'Оценка', '2', '4', '6-Циклогептатриен-1-он', '3', '5-бис-триметилсилил-', '8,705', '626', 'Площадь', ' 386902,453', 'tR (мин)', '8,705', '']
Название соединения, RT, оценка\nБензол, 4-этенил-1,2-диметил -,11.682,600,Area,16289.239,tR (мин),11.682
['Название соединения', 'RT', 'Оценка', 'Бензол', ' 4-этенил-1', '2-диметил-', '11,682', ''600', 'Площадь', '16289,239', 'tR (мин)', '11,682', '']
Название соединения, RT, Оценка\n2-(п-Толил)пропан-2-ол, ТМС, 11,921,605, Площадь, 17976,558,tR (мин), 11,921< /p>
['Название соединения', 'RT', 'Оценка', '2-(п-толил)пропан-2-ол', 'TMS', '11.921', '605' , 'Площадь', '17976,558', 'tR (мин)', '11,921', '']
Название соединения, RT, Оценка\nТрис(трет-бутилдиметилсилилокси )arsane,12.036,685,Area,76702.743,tR (мин),12.036
['Имя соединения', 'RT', 'Оценка', 'Трис(терт -бутилдиметилсилилокси)арсан', '12.036', '685', 'Площадь', '76702.743', 'tR (мин)', '12.036', '']
Название соединения, RT, Оценка\nФенил-пентаметилдисилоксан, 13,646,656, Площадь, 84633,281, tR (мин), 13,646
['Название соединения', ' RT', 'Оценка', 'Фенил-пентаметилдисилоксан', '13,646', '656', 'Площадь', '84633,281', 'tR (мин)', '13,646', '']Название соединения, RT, Оценка\n**[1,1'-бициклопропил]-2-октановая кислота, 2'-гексил-, метиловый эфир**, 16,642,605, Площадь, 566,512,tR (мин), 16,642
['Название соединения', 'RT', 'Оценка', '[1', «1'-бициклопропил]-2-октановая кислота», « 2 '-гексил-', 'метиловый эфир', '16,642', '605', 'Площадь', '566,512', 'tR (мин)', '16,642', '']
Название соединения, RT, Оценка\n**(т-Бутил-диметилсилил)[2-метил-2-(4-метил-пент-3-енил)-c**,19,853,650, Площадь, 10141,071, tR (мин), 19,853
Жирным шрифтом выделены названия химических соединений, которые изменяются больше всего и являются основной причиной проблем, и сразу же мой результат на Python . Эти химические названия следует рассматривать как целую строку, что может произойти в некоторых случаях. Все остальное между запятыми должно быть разделено.
Смысл в том, чтобы сначала вычесть эти химические соединения как отдельные символы.
У меня был первый шаблон, который раньше работал с более простыми названиями соединений. :
pattern = r',(?=(?:[^"]*"[^"]*")*[^"]*$)|\n(?=(?:[^"]*"[^"]*")*[^"]*$)'
который помещает все составные имена в одинарные кавычки в двойные кавычки, чтобы рассматривать их как одну строку символов. Однако теперь он разделится, если будет найден ,, и, как вы можете видеть в примерах, соединения не заключаются в одинарные кавычки.
Я считаю, что с этим гораздо проще справиться, используя позади: сначала получите часть ,8.705,626,Area,386902.453,tR (min),8.705 и обрабатывайте все перед ней как одну строку. Здесь Area и tR(min) не изменятся, однако их сопровождающие числа изменятся.
Есть идеи, как разделить обе стороны линии, комплекс и остальное? Должен ли я использовать специальные символы RegEx ^ и $?
КОД:
import os
import io # for utf8
import sys
import re
from pprint import pprint
import xlsxwriter # for the data, to write them into xlsx.
import tkinter as tk # for GUI
from tkinter import filedialog # for GUI
from collections import Counter # for another thing
file_path=filedialog.askopenfilename()
file=io.open(file_path,'r',encoding="utf-8")
filecsvname=os.path.basename(file.name)
lines=file.readlines()
file.close()
filename=filecsvname.strip('.csv')
liness=[]
seqnames=[]
for i in range(len(lines)-1):
i
lines
if lines.startswith('Compound')==True and lines[i+1].startswith('A')==False:
liness.append(lines+lines[i+1])
elif lines.startswith('Area')==True:
liness.append(lines+',Compound Name, ')
elif lines.startswith('Sample Name')==True:
liness.append(lines)
elif lines.startswith('Sequence Name')==True:
seqnames.append(lines)
liness.append(lines)
# some irrelevant extra code for seqnames.
pattern = r',(?=(?:[^"]*"[^"]*")*[^"]*$)|\n(?=(?:[^"]*"[^"]*")*[^"]*$)'
datalines=[]
for i in range(len(liness)):
lineofdata=liness[i].rstrip('\t')
splittedlines=re.split(pattern,lineofdata)
datalines.append(splittedlines)
Минимальный пример
Извлечение входного файла *.csv. Ссылка на файл: https://drive.google.com/file/d/1rXanJd ... sp=sharing
Основная идея здесь — автоматически сделать его красивее для Excel. через скрипт.
Sequence Name,20240603_S24031_anonymous
Sample Name,Blank
Area,15906292.428,tR (min),3.696
Area,10164232.248,tR (min),3.783
Area,5541647.716,tR (min),4.091
Area,203969.547,tR (min),6.514
Area,542692.442,tR (min),6.579
Area,1039445.806,tR (min),6.788
Area,4011338.408,tR (min),7.249
Area,504687.529,tR (min),8.177
Area,108363.994,tR (min),8.420
Compound Name,RT,Score
2,4,6-Cycloheptatrien-1-one, 3,5-bis-trimethylsilyl-,8.705,626,Area,386902.453,tR (min),8.705
Area,368393.389,tR (min),8.850
Area,91574.405,tR (min),9.447
Area,899294.259,tR (min),9.651
Area,193389.843,tR (min),10.041
Area,56853.148,tR (min),10.812
Compound Name,RT,Score
Benzene, 4-ethenyl-1,2-dimethyl-,11.682,600,Area,16289.239,tR (min),11.682
Compound Name,RT,Score
2-(p-Tolyl)propan-2-ol, TMS,11.921,605,Area,17976.558,tR (min),11.921
Area,78966.216,tR (min),12.031
Compound Name,RT,Score
Tris(tert-butyldimethylsilyloxy)arsane,12.036,685,Area,76702.743,tR (min),12.036
Area,534.128,tR (min),12.285
Compound Name,RT,Score
Phenyl-pentamethyl-disiloxane,13.646,656,Area,84633.281,tR (min),13.646
Area,11464.379,tR (min),13.696
Compound Name,RT,Score
Cyclopentene, 3,3-dimethyl-4-methylene-1,2-bis(trimethylsil,14.543,645,Area,402308.085,tR (min),14.543
Подробнее здесь: https://stackoverflow.com/questions/790 ... om-pattern