parsing string into dict

Aleksey alekseymv at gmail.com
Thu Sep 2 08:42:55 EDT 2010


On Sep 2, 12:46 am, Tim Arnold <a_j... at bellsouth.net> wrote:
> Hi,
> I have a set of strings that are *basically* comma separated, but with
> the exception that if a comma occur insides curly braces it is not a
> delimiter.  Here's an example:
>
> [code=one, caption={My Analysis for \textbf{t}, Version 1}, continued]
>
> I'd like to parse that into a dictionary (note that 'continued' gets
> the value 'true'):
> {'code':'one', 'caption':'{My Analysis for \textbf{t}, Version
> 1}','continued':'true'}
>
> I know and love pyparsing, but for this particular code I need to rely
> only on the standard library (I'm running 2.7). Here's what I've got,
> and it works. I wonder if there's a simpler way?
> thanks,
> --Tim Arnold
>
> The 'line' is like my example above but it comes in without the ending
> bracket, so I append one on the 6th line.
>


You can use regular expression (also you not need adding ending
bracket):

import re
patt = re.compile(ur'\[code=(?P<CODE>\w+),\scaption=(?P<CAPTION>\{.+\})
(?P<CONTINUED>,\scontinued)?\]?')
def parse_options(s):
	g=patt.match(s).groupdict()
	return {'caption' : g['CAPTION'], 'code' : g['CODE'], 'continued' :
g['CONTINUED'] and True or False}


Test is next:


>>> s=u'[code=one, caption={My Analysis for \textbf{t}, Version 1}, continued]'
>>> s1=u'[code=one, caption={My Analysis for \textbf{t}, Version 1}]'
>>> s2=u'[code=one, caption={My Analysis for \textbf{t}, Version 1}, continued'
>>> s3=u'[code=one, caption={My Analysis for \textbf{t}, Version 1}'

>>> parse_options(s)
{'caption': u'{My Analysis for \textbf{t}, Version 1}', 'code':
u'one', 'continued': True}
>>> parse_options(s1)
{'caption': u'{My Analysis for \textbf{t}, Version 1}', 'code':
u'one', 'continued': False}
>>> parse_options(s2)
{'caption': u'{My Analysis for \textbf{t}, Version 1}', 'code':
u'one', 'continued': True}
>>> parse_options(s3)
{'caption': u'{My Analysis for \textbf{t}, Version 1}', 'code':
u'one', 'continued': False}
>>>



More information about the Python-list mailing list