Hi, > import re > foo_pattern = re.compile('foo') > > '>>> m = foo_pattern.search(subject) > '>>> if m: > '>>> pass > '>>> else: > '>>> pass
I agree that is horrible. This is one of my favorite problems with python syntax. > but it occured to me today, that it is possible to do it in python > without the extra line. > ' > '>>> def xsearch(pattern, subject): > '>>> yield pattern.search(subject) > > '>>> for m in xsearch(foo_pattern, subject): > '>>> pass > '>>> else: > '>>> pass I think I wouldd rather have it this way, based on a suggestion by Diez B. Roggisch recently: import re class matcher: def __init__(self, regex): self.regex = re.compile(regex) def match(self, s): self.m = self.regex.match(s) return not self.m is None def search(self, s): self.m = self.regex.search(s) return not self.m is None def group(self, n = None): if n is None: return self.m.group() return self.m.group(n) m = matcher('(foo)(.*)') if m.match('foobar'): print m.group() if m.search('barfoobaz'): print m.group(2) I think one solution that does not need a wrapper class would be to add the group() method to the match objects from module 're'. IIRC, the obsolete package 'regex' provided this, once upon a time. Cheers, Johann -- http://mail.python.org/mailman/listinfo/python-list