2015-10-15 4 views
1

Я пишу функцию python, чтобы взять фрагмент текста, проанализированный из текстового файла с использованием f.readlines и разбив этот кусок текста на список. Текст содержит разделители, и я хочу разделить этот текст именно в этих местах. Ниже приведен пример текстового файла.Разделение текстового документа на определенные строки текста с использованием python

@model:2.4.0=Skeleton "Skeleton" 
@compartments 
Cell=1.0 "Cell" 
@species 
Cell:[A]=100.0 "A" 
Cell:[B]=1.0 "B" 
Cell:[C]=0.0 "C" 
Cell:[D]=0.0 "D" 
@parameters 
kcat=4000 
km = 146 
v2_k = 88 
@reactions 
@r=v1 "v1" 
A -> C : B 
Cell * kcat * B * A/(km + A) 
@r=v2 "v2" 
C -> C+D 
Cell * v2_k * C 

Моего желаемый результат должен иметь словарь питона, который имеет имя разделителей в качестве ключей и всего содержания между этим делителем и следующим в качестве значений. Например, первый элемент sections словаря должно быть:

sections['@model']=:2.4.0=Skeleton "Skeleton" 

Текущий код

def split_sections(SBshorthand_file): 
    ''' 
    Takes a SBshorthand file and returns a dictionary of each of the sections. 
    Keys of the dictionary are the dividers. 
    Values of dictionary are the content between dividers. 
    ''' 
    SBfile=parse_SBshorthand_read(SBshorthand_file) #simple parsing function. uses f.read() 
    dividers=["@model", "@units", "@compartments", "@species", "@parameters", "@rules", "@reactions", "@events"] 
    sections={} 
    for i in dividers: 
     pattern=re.compile(i) 
     if re.findall(pattern,SBfile) == []: 
      pass 
#   print 'Section \'{}\' not present in {}'.format(i,SBshorthand_file) 
     else: 
      SBfile2=re.sub(pattern,'\n'+i,SBfile) 
      print SBfile2 

Это, однако, не делать то, что я хочу. У кого-нибудь есть идеи, как исправить мой код? Благодаря

----------------- Редактировать --------------------

Пожалуйста, обратите внимание, что раздел «@reactions» содержит ряд «реакций», все из которых начинаются с @r, но все они должны быть сгруппированы под ключом реакции.

ответ

1
import re 

x="""@model:2.4.0=Skeleton "Skeleton" 
@compartments 
Cell=1.0 "Cell" 
@species 
Cell:[A]=100.0 "A" 
Cell:[B]=1.0 "B" 
Cell:[C]=0.0 "C" 
Cell:[D]=0.0 "D" 
@parameters 
kcat=4000 
km = 146 
v2_k = 88 
@reactions 
@r=v1 "v1" 
A -> C : B 
Cell * kcat * B * A/(km + A) 
@r=v2 "v2" 
C -> C+D 
Cell * v2_k * C""" 


print dict(re.findall(r"(?:^|(?<=\n))(@\w+)([\s\S]*?)(?=\[email protected](?!r\b)\w+|$)",x)) 

Вы можете непосредственно использовать re.findall и получить то, что вы хотите.

+0

К сожалению, я случайно отредактировали вместо вопроса и это обыкновение позвольте мне изменить его обратно. Ваш код работает, но вы знаете, чтобы исключить тег '@r' (как я объяснил в редакции). Спасибо – CiaranWelsh

+0

@ user3059024 проверить правку. – vks

1

Вы можете использовать группы захвата следующим образом:

re.findall(r"(?s)(@.*?)[\s:]\s+(.*?)(?=[@$])"); 

demo

where capture group1 matches the key 
capture group2 matches the value 
Смежные вопросы