Kent Johnson wrote: > You might want to look at doing this with pyparsing, I think it will > make it easier to get the data out vs just recognizing the correct pattern.
Here is a pyparsing version that correctly recognizes all of your patterns and returns a (possibly nested) Python list in case of a match. Note that this version will parse lists that are nested arbitrarily deeply. If you don't want that you will have to define two kinds of lists, a singly-nested list and a non-nested list. Kent from pyparsing import * List = Forward() T = Literal('true').setParseAction( lambda s,l,t: [ True ] ) F = Literal('false').setParseAction( lambda s,l,t: [ False ] ) String = QuotedString('"') Number = Word(nums).setParseAction( lambda s,l,t: [ int(t[0]) ] ) List << Literal('{').suppress() + delimitedList(T|F|String|Number|Group(List)) + Literal('}').suppress() def IsASList(s): # AppleScript lists are bracked by curly braces with items separate by commas # Each item is an alphanumeric label(?) or a string enclosed by # double quotes or a list itself # e.g. {2, True, "hello"} try: parsed = List.parseString(s) return parsed.asList() except Exception, e: return None sample_strs = [ '{}', # Empty list '{a}', # Should not match '{a, b, c}', # Should not match '{"hello"}', '{"hello", "kitty"}', '{true}', '{false}', '{true, false}', '{9}', '{9,10, 11}', '{93214, true, false, "hello", "kitty"}', '{{1, 2, 3}}', # This matches '{{1, 2, "cat"}, 1}', # This matches # These don't match: '{{1,2,3},1,{4,5,6},2}', '{1, {2, 3, 4}, 3}', '{{1, 2, 3}, {4, 5, 6}, 1}', '{1, {1, 2, 3}}', # Should match but doesn't '{93214, true, false, "hello", "kitty", {1, 2, 3}}', # Should match but doesn't '{label: "hello", value: false, num: 2}', # AppleScript dictionary - should not match ] for sample in sample_strs: result = IsASList(sample) print 'Is AppleScript List: %s; String: %s' % (bool(result), sample) if result: print result _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor