summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2016-06-18 16:48:07 +0300
committerSerhiy Storchaka <storchaka@gmail.com>2016-06-18 16:48:07 +0300
commit977b3ac1c1cf18ce8967503ac7a8638a819a5c22 (patch)
treee17173039c613e2d2c22387397bf01fd99ace433
parent3583c3bd1dae286144ff3cc1ccc7982a8a5966e7 (diff)
downloadcpython-git-977b3ac1c1cf18ce8967503ac7a8638a819a5c22.tar.gz
Issue #27177: Match objects in the re module now support index-like objects
as group indices. Based on patches by Jeroen Demeyer and Xiang Zhang.
-rw-r--r--Lib/test/test_re.py28
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_sre.c5
3 files changed, 27 insertions, 9 deletions
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index e27591c4fc..24a0604948 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -414,19 +414,33 @@ class ReTests(unittest.TestCase):
self.assertEqual(pat.match('bc').groups(), ('b', None, 'b', 'c'))
self.assertEqual(pat.match('bc').groups(""), ('b', "", 'b', 'c'))
- # A single group
- m = re.match('(a)', 'a')
- self.assertEqual(m.group(0), 'a')
- self.assertEqual(m.group(0), 'a')
- self.assertEqual(m.group(1), 'a')
- self.assertEqual(m.group(1, 1), ('a', 'a'))
-
pat = re.compile('(?:(?P<a1>a)|(?P<b2>b))(?P<c3>c)?')
self.assertEqual(pat.match('a').group(1, 2, 3), ('a', None, None))
self.assertEqual(pat.match('b').group('a1', 'b2', 'c3'),
(None, 'b', None))
self.assertEqual(pat.match('ac').group(1, 'b2', 3), ('a', None, 'c'))
+ def test_group(self):
+ class Index:
+ def __init__(self, value):
+ self.value = value
+ def __index__(self):
+ return self.value
+ # A single group
+ m = re.match('(a)(b)', 'ab')
+ self.assertEqual(m.group(), 'ab')
+ self.assertEqual(m.group(0), 'ab')
+ self.assertEqual(m.group(1), 'a')
+ self.assertEqual(m.group(Index(1)), 'a')
+ self.assertRaises(IndexError, m.group, -1)
+ self.assertRaises(IndexError, m.group, 3)
+ self.assertRaises(IndexError, m.group, 1<<1000)
+ self.assertRaises(IndexError, m.group, Index(1<<1000))
+ self.assertRaises(IndexError, m.group, 'x')
+ # Multiple groups
+ self.assertEqual(m.group(2, 1), ('b', 'a'))
+ self.assertEqual(m.group(Index(2), Index(1)), ('b', 'a'))
+
def test_re_fullmatch(self):
# Issue 16203: Proposal: add re.fullmatch() method.
self.assertEqual(re.fullmatch(r"a", "a").span(), (0, 1))
diff --git a/Misc/NEWS b/Misc/NEWS
index 6c7555af5b..bb1675cc9e 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.6.0 alpha 3
Library
-------
+- Issue #27177: Match objects in the re module now support index-like objects
+ as group indices. Based on patches by Jeroen Demeyer and Xiang Zhang.
+
- Issue #26754: Some functions (compile() etc) accepted a filename argument
encoded as an iterable of integers. Now only strings and byte-like objects
are accepted.
diff --git a/Modules/_sre.c b/Modules/_sre.c
index fb0ab033c5..d379363729 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -2049,8 +2049,9 @@ match_getindex(MatchObject* self, PyObject* index)
/* Default value */
return 0;
- if (PyLong_Check(index))
- return PyLong_AsSsize_t(index);
+ if (PyIndex_Check(index)) {
+ return PyNumber_AsSsize_t(index, NULL);
+ }
i = -1;