Matt - Pyparsing may be of interest to you. One of its core features is the ability to associate an action method with a parsing pattern. During parsing, the action is called with the original source string, the location within the string of the match, and the matched tokens.
Your code would look something like : lbrace = Literal('{') typedef = Literal('typedef') struct = Literal('struct') rx1 = struct + lbrace rx2 = typedef + struct + lbrace rx3 = Literal('something') + Literal('else') def rx1Action(strg, loc, tokens): ... put stuff to do here... rx1.setParseAction( rx1Action ) rx2.setParseAction( rx2Action ) rx3.setParseAction( rx3Action ) # read code into Python string variable 'code' patterns = (rx1 | rx2 | rx3) patterns.scanString( code ) (I've broken up some of your literals, which allows for intervening variable whitespace - that is Literal('struct') +Literal('{') will accommodate one, two, or more blanks (even line breaks) between the 'struct' and the '{'.) Get pyparsing at http://pyparsing.sourceforge.net. -- Paul -- http://mail.python.org/mailman/listinfo/python-list