diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index b195fd01dc9b..2ebce8947e01 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -225,13 +225,25 @@ def tell(self):
def seek(self, index):
self.index, self.next = index
+# The following three functions are not used in this module anymore, but we keep
+# them here (with DeprecationWarnings) for backwards compatibility.
+
def isident(char):
+ import warnings
+ warnings.warn('sre_parse.isident() will be removed in 3.5',
+ DeprecationWarning, stacklevel=2)
return "a" <= char <= "z" or "A" <= char <= "Z" or char == "_"
def isdigit(char):
+ import warnings
+ warnings.warn('sre_parse.isdigit() will be removed in 3.5',
+ DeprecationWarning, stacklevel=2)
return "0" <= char <= "9"
def isname(name):
+ import warnings
+ warnings.warn('sre_parse.isname() will be removed in 3.5',
+ DeprecationWarning, stacklevel=2)
# check that group name is a valid string
if not isident(name[0]):
return False
@@ -587,7 +599,7 @@ def _parse(source, state):
group = 1
if not name:
raise error("missing group name")
- if not isname(name):
+ if not name.isidentifier():
raise error("bad character in group name")
elif sourcematch("="):
# named backreference
@@ -601,7 +613,7 @@ def _parse(source, state):
name = name + char
if not name:
raise error("missing group name")
- if not isname(name):
+ if not name.isidentifier():
raise error("bad character in group name")
gid = state.groupdict.get(name)
if gid is None:
@@ -655,7 +667,7 @@ def _parse(source, state):
group = 2
if not condname:
raise error("missing group name")
- if isname(condname):
+ if condname.isidentifier():
condgroup = state.groupdict.get(condname)
if condgroup is None:
raise error("unknown group name")
@@ -792,7 +804,7 @@ def literal(literal, p=p, pappend=a):
if index < 0:
raise error("negative group number")
except ValueError:
- if not isname(name):
+ if not name.isidentifier():
raise error("bad character in group name")
try:
index = pattern.groupindex[name]
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index ef19164ed818..e90c770940ff 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -180,6 +180,10 @@ def test_symbolic_groups(self):
self.assertRaises(re.error, re.compile, '(?(a))')
self.assertRaises(re.error, re.compile, '(?(1a))')
self.assertRaises(re.error, re.compile, '(?(a.))')
+ # New valid/invalid identifiers in Python 3
+ re.compile('(?P<ยต>x)(?P=ยต)(?(ยต)y)')
+ re.compile('(?P<๐๐ซ๐ฆ๐ ๐ฌ๐ก๐ข>x)(?P=๐๐ซ๐ฆ๐ ๐ฌ๐ก๐ข)(?(๐๐ซ๐ฆ๐ ๐ฌ๐ก๐ข)y)')
+ self.assertRaises(re.error, re.compile, '(?P<ยฉ>x)')
def test_symbolic_refs(self):
self.assertRaises(re.error, re.sub, '(?Px)', '\gx)|(?Py)', '\g', 'xx')
self.assertRaises(re.error, re.sub, '(?Px)|(?Py)', '\\2', 'xx')
self.assertRaises(re.error, re.sub, '(?Px)', '\g<-1>', 'xx')
+ # New valid/invalid identifiers in Python 3
+ self.assertEqual(re.sub('(?P<ยต>x)', r'\g<ยต>', 'xx'), 'xx')
+ self.assertEqual(re.sub('(?P<๐๐ซ๐ฆ๐ ๐ฌ๐ก๐ข>x)', r'\g<๐๐ซ๐ฆ๐ ๐ฌ๐ก๐ข>', 'xx'), 'xx')
+ self.assertRaises(re.error, re.sub, '(?Px)', r'\g<ยฉ>', 'xx')
def test_re_subn(self):
self.assertEqual(re.subn("(?i)b+", "x", "bbbb BBBB"), ('x x', 2))