suggestion for module re
Fredrik Lundh
fredrik at pythonware.com
Mon Oct 22 16:44:04 EDT 2001
Jose Sebrosa wrote:
> Anyway, it still remains the need of a function to travel through a string and
> collect all the matches in one single object, *while preserving the names*.
if you pass a callable object to the sub method, that object will
be called with a match object for each match in the string.
for example:
import re
class Scanner:
def __init__(self, pattern):
self.pattern = re.compile(pattern)
def parse(self, string):
self.result = []
self.pattern.sub(self.handler, string)
return self.result
def handler(self, match):
# can be overridden
self.result.append(match.groupdict())
return "" # must return string
>>> scanner = Scanner('(?P<a>a|A)(?P<b>b|B)')
>>> for item in scanner.parse('aBAb'):
>>> print item
{'b': 'B', 'a': 'a'}
{'b': 'b', 'a': 'A'}
this works with 1.5.2 and newer. to get custom behaviour,
override the "handler" method.
in Python 2.2, you can use the undocumented scanner object,
together with an iterator, to loop over every match:
>>> import re
>>> p = re.compile('(?P<a>a|A)(?P<b>b|B)')
>>> for match in iter(p.scanner('aBAb').search, None):
>>> print match.groupdict()
{'a': 'a', 'b': 'B'}
{'a': 'A', 'b': 'b'}
</F>
<!-- (the eff-bot guide to) the python standard library:
http://www.pythonware.com/people/fredrik/librarybook.htm
-->
More information about the Python-list
mailing list