- make sure group names are valid identifiers
  (closes the "SRE: symbolic reference" bug)
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index 9f5386e..8ab36c8 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -168,6 +168,24 @@
 	self.next = self.__next()
 	return this
 
+def isident(char):
+    return "a" <= char <= "z" or "A" <= char <= "Z" or char == "_"
+
+def isdigit(char):
+    return "0" <= char <= "9"
+
+def isname(name):
+    # check that group name is a valid string
+    # FIXME: <fl> this code is really lame.  should use a regular
+    # expression instead, but I seem to have certain bootstrapping
+    # problems here ;-)
+    if not isident(name[0]):
+	return 0
+    for char in name:
+	if not isident(char) and not isdigit(char):
+	    return 0
+    return 1
+
 def _group(escape, state):
     # check if the escape string represents a valid group
     try:
@@ -418,9 +436,10 @@
 				raise error, "unterminated name"
 			    if char == ">":
 				break
-			    # FIXME: check for valid character
 			    name = name + char
 			group = 1
+			if not isname(name):
+			    raise error, "illegal character in group name"
 		    elif source.match("="):
 			# named backreference
 			raise error, "not yet implemented"
@@ -522,20 +541,21 @@
 		    while 1:
 			char = s.get()
 			if char is None:
-			    raise error, "unterminated index"
+			    raise error, "unterminated group name"
 			if char == ">":
 			    break
-			# FIXME: check for valid character
 			name = name + char
 		if not name:
-		    raise error, "bad index"
+		    raise error, "bad group name"
 		try:
 		    index = int(name)
 		except ValueError:
+		    if not isname(name):
+			raise error, "illegal character in group name"
 		    try:
 			index = pattern.groupindex[name]
 		    except KeyError:
-			raise IndexError, "unknown index"
+			raise IndexError, "unknown group name"
 		a((MARK, index))
 	    elif len(this) > 1 and this[1] in DIGITS:
 		while s.next in DIGITS: