summaryrefslogtreecommitdiffstats
path: root/Modules/_sre.c
diff options
context:
space:
mode:
authorGustavo Niemeyer <gustavo@niemeyer.net>2003-04-27 12:34:14 (GMT)
committerGustavo Niemeyer <gustavo@niemeyer.net>2003-04-27 12:34:14 (GMT)
commitc34f2555bd414254f941d0659ba9c229b96ec728 (patch)
tree7c7a681087d14a07eecae1aa2d870e3dd44af452 /Modules/_sre.c
parent9dcbbea87867f38f7994dd96388266114ef0c162 (diff)
downloadcpython-c34f2555bd414254f941d0659ba9c229b96ec728.zip
cpython-c34f2555bd414254f941d0659ba9c229b96ec728.tar.gz
cpython-c34f2555bd414254f941d0659ba9c229b96ec728.tar.bz2
Applied patch #725106, by Greg Chapman, fixing capturing groups
within repeats of alternatives. The only change to the original patch was to convert the tests to the new test_re.py file. This patch fixes cases like: >>> re.match('((a)|b)*', 'abc').groups() ('b', '') Which is wrong (it's impossible to match the empty string), and incompatible with other regex systems, like the following examples show: % perl -e '"abc" =~ /^((a)|b)*/; print "$1 $2\n";' b a % echo "abc" | sed -r -e "s/^((a)|b)*/\1 \2|/" b a|c
Diffstat (limited to 'Modules/_sre.c')
-rw-r--r--Modules/_sre.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/Modules/_sre.c b/Modules/_sre.c
index 3f17d13..b9e1827 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -947,10 +947,20 @@ SRE_MATCH(SRE_STATE* state, SRE_CODE* pattern, int level)
if (pattern[1] == SRE_OP_IN &&
(ptr >= end || !SRE_CHARSET(pattern + 3, (SRE_CODE) *ptr)))
continue;
+ if (state->repeat) {
+ i = mark_save(state, 0, lastmark);
+ if (i < 0)
+ return i;
+ }
state->ptr = ptr;
i = SRE_MATCH(state, pattern + 1, level + 1);
if (i)
return i;
+ if (state->repeat) {
+ i = mark_restore(state, 0, lastmark);
+ if (i < 0)
+ return i;
+ }
LASTMARK_RESTORE();
}
return 0;