On Mar 2, 8:41 am, Andrew Warkentin <[EMAIL PROTECTED]> wrote: > I am writing a filtering HTTP proxy (the site > ishttp://xuproxy.sourceforge.net/). I want it to be compatible with > Proxomitron (http://proxomitron.info/) filters. I need a regular > expression parser that allows patterns to call functions (or more > likely, class methods), to implement "matching commands" (look at the > Proxmitron documentation to see what I mean). Does anyone know if such a > library exists for Python, or do I have to write my own parser?
Andrew - Pyparsing allows you to define parse actions that get called when element within a grammar are matched. These actions can update external data structures, modify the matched text, or can be used to provide additional semantic validation. Here's an example: from pyparsing import * integer = Regex(r"\b\d+\b") # could also be written as #~ integer = WordStart() + Word(nums) + WordEnd() # convert matched text to actual integer def cvt_to_int (tokens): return int(tokens[0]) # only accept integers < 100 def must_be_less_than_100(tokens): if (tokens[0]) >= 100: raise ParseException("only integers < 100 are allowed") # add value to running tally of matches def increment_tally(tokens): global running_total running_total += tokens[0] integer.setParseAction( cvt_to_int) integer.addParseAction( must_be_less_than_100 ) integer.addParseAction( increment_tally ) # could also be written as #~ integer.setParseAction( cvt_to_int, #~ must_be_less_than_100, #~ increment_tally ) running_total = 0 print integer.searchString("absdlkj 1 5 12 121 78 22") print running_total Prints: [[1], [5], [12], [78], [22]] 118 More info about pyparsing at http://pyparsing.wikispaces.com, plus more examples, and links to other doc sources. -- Paul -- http://mail.python.org/mailman/listinfo/python-list