Author: Bruno Gola <brunog...@gmail.com> Branch: Changeset: r48548:4c56b2a60b5a Date: 2011-10-27 19:52 -0200 http://bitbucket.org/pypy/pypy/changeset/4c56b2a60b5a/
Log: [fixes issue 923] matching RegExp with optional zero-width assertion groups diff --git a/pypy/rlib/rsre/rsre_core.py b/pypy/rlib/rsre/rsre_core.py --- a/pypy/rlib/rsre/rsre_core.py +++ b/pypy/rlib/rsre/rsre_core.py @@ -389,6 +389,9 @@ # zero-width match protection min = ctx.pat(ppos+1) if self.num_pending >= min: + if ptr == ctx.match_end and ctx.match_marks: + # matched marks inside a zero-width assertion + marks = ctx.match_marks while enum is not None and ptr == ctx.match_end: enum = enum.move_to_next_result(ctx) # diff --git a/pypy/rlib/rsre/test/test_re.py b/pypy/rlib/rsre/test/test_re.py --- a/pypy/rlib/rsre/test/test_re.py +++ b/pypy/rlib/rsre/test/test_re.py @@ -226,6 +226,13 @@ (None, 'b', None)) assert pat.match('ac').group(1, 'b2', 3) == ('a', None, 'c') + def test_bug_923(self): + # Issue923: grouping inside optional lookahead problem + assert re.match(r'a(?=(b))?', "ab").groups() == ("b",) + assert re.match(r'(a(?=(b))?)', "ab").groups() == ('a', 'b') + assert re.match(r'(a)(?=(b))?', "ab").groups() == ('a', 'b') + assert re.match(r'(?P<g1>a)(?=(?P<g2>b))?', "ab").groupdict() == {'g1': 'a', 'g2': 'b'} + def test_re_groupref_exists(self): assert re.match('^(\()?([^()]+)(?(1)\))$', '(a)').groups() == ( ('(', 'a')) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit