how to get all the "variables" of a string formating?

Tim Chase python.list at tim.thechases.com
Thu Dec 7 06:40:31 EST 2006


> I'd like to see this regex. And make sure it works correctly with this
> format string:
> 
> """%(key)s
> %%(this is not a key)d
> %%%(but this is)f 
> %%%%%%%(%(and so is this)%()%%)u 
> and don't forget the empty case %()c
> but not %%%%%%()E
> and remember to handle %(new
> lines)X correctly
> and %(percentages)%."""
> 
> It should list the keys as:
> 
> 'key'
> 'but this is'
> '%(and so is this)%()%%' 
> ''
> 'new\nlines'
> 'percentages'
> 
> 
> I love easy regexes :-)

 >>> r = re.compile(r'(?<!%)(?:%%)*%\(([^)]*)\)')

works on all but your pathological '%(and so is this)%()%%' and 
if any programmer working for me used that as their formatting 
variable, they'd either be out of a job, or I would be for hiring 
such a psychopath. :)

 >>> print r.sub(lambda x: '@@@%s@@@' % x.group(0), s)
@@@%(key)@@@s
%%(this is not a key)d
@@@%%%(but this is)@@@f
@@@%%%%%%%(%(and so is this)@@@@@@%()@@@%%)u
and don't forget the empty case @@@%()@@@c
but not %%%%%%()E
and remember to handle @@@%(new
lines)@@@X correctly
and @@@%(percentages)@@@%.
 >>> keys = r.findall(s)
 >>> keys
['key', 'but this is', '%(and so is this', '', '', 'new\nlines', 
'percentages']

The extra empty item (keys[3]) is from that pathological case. 
Otherwise, it seems to do the trick.

-tkc
ps:  you're a cruel, cruel fellow for throwing out such a 
mind-bender this early in my morning. :)  Thanks for the fun!





More information about the Python-list mailing list