code: def transformString( self, instring ):
          
          out = []
          lastE = 0
          # force preservation of <TAB>s, to minimize unwanted transformation of string, and to
          # keep string locs straight between transformString and scanString
          self.keepTabs = True
          for t,s,e in self.scanString( instring ):
              out.append( instring[lastE:s] )
              if t:
                  if isinstance(t,ParseResults):
                      out += t.asList()
                  elif isinstance(t,list):
                      out += t
                  else:
                      out.append(t)
              lastE = e
          out.append(instring[lastE:])
          return "".join(map(_ustr,out))
docs: Extension to scanString, to modify matching text with modified tokens that may
             be returned from a parse action.  To use transformString, define a grammar and
             attach a parse action to it that modifies the returned token list.
             Invoking transformString() on a target string will then scan for matches,
             and replace the matched text patterns according to the logic in the parse
             action.  transformString() returns the resulting transformed string.