У меня проблема с регулярным выражением со строковым шаблоном, который я использовал для извлечения из них данных, разбивая его.
Я использую 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)
Подробнее здесь: https://stackoverflow.com/questions/790 ... om-pattern