Pyparsing удобен для такого рода вещей, когда вы не знаете, когда натолкнетесь на лишние пробелы, комментарии, что угодно.Подобно именованным группам в RE, этот пример определяет имя результатов 'параметры', которое используется для извлечения нужных данных:
>>> code = """\
... ...
...
... food($apples$ , $oranges$ , $pears$ , $tomato$){
... ...
... }
... ...
... food($peanuts$, $popcorn$ ,$candybars$ ,$icecream$){
... ...
... }
... """
>>> from pyparsing import *
>>> LPAR,RPAR,LBRACE,RBRACE,DOLLAR = map(Suppress,"(){}$")
>>> param = DOLLAR + Word(alphas) + DOLLAR
>>> funcCall = "food" + LPAR + delimitedList(param)("parameters") + RPAR + LBRACE
>>> for fn in funcCall.searchString(code):
... print fn.parameters
...
['apples', 'oranges', 'pears', 'tomato']
['peanuts', 'popcorn', 'candybars', 'icecream']
Если я изменю вторую функцию на:
... food($peanuts$, $popcorn$ ,/*$candybars$ ,*/$icecream$){
И затем добавьте эту строку:
>>> funcCall.ignore(cStyleComment)
Тогда я получу:
>>> for fn in funcCall.searchString(code):
... print fn.parameters
...
['apples', 'oranges', 'pears', 'tomato']
['peanuts', 'popcorn', 'icecream']