Hi,
I have a string '((1,2), (3,4))' and I want to convert this into a
python tuple of numbers. But I do not want to use eval() because I do
not want to execute any code in that string and limit it to list of
numbers.
Is there any alternative way?
Thanks.
Suresh
Pyparsing comes with an example that parses strings representing lists.
Here's that example, converted to parsing only tuples of numbers. Note that
this does not presume that tuples are only pairs, but can be any number of
numeric values, nested to any depth, and with arbitrary whitespace, etc.
This grammar also includes converters by type, so that ints come out as
ints, and floats as floats. (This grammar doesn't handle empty tuples, but
it does handle tuples that include an extra ',' after the last tuple
element.)
-- Paul
Download pyparsing at
http://sourceforge.net/projects/pyparsing/ .
from pyparsing import *
integer = (Word(nums)|Word('-+',nums)).setName("integer")
real = Combine(integer + "." + Optional(Word(nums))).setName("real")
tupleStr = Forward().setName("tuple")
tupleItem = real | integer | tupleStr
tupleStr << ( Suppress("(") + delimitedList(tupleItem) +
Optional(Suppress(",")) + Suppress(")") )
# add parse actions to do conversion during parsing
integer.setParseAction( lambda toks: int(toks[0]) )
real.setParseAction( lambda toks: float(toks[0]) )
tupleStr.setParseAction( lambda toks: tuple(toks) )
s = '((1,2), (3,4), (-5,9.2),)'
print tupleStr.parseString(s)[0]
Gives:
((1, 2), (3, 4), (-5, 9.1999999999999993))