- experimental: added two new attributes to the match object:
  "lastgroup" is the name of the last matched capturing group,
  "lastindex" is the index of the same group.  if no group was
  matched, both attributes are set to None.

  the (?P#) feature will be removed in the next relase.
diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py
index e5c501e..36986eb 100644
--- a/Lib/sre_compile.py
+++ b/Lib/sre_compile.py
@@ -298,8 +298,14 @@
     assert p.pattern.groups <= 100,\
            "sorry, but this version only supports 100 named groups"
 
+    # map in either direction
+    groupindex = p.pattern.groupdict
+    indexgroup = [None] * p.pattern.groups
+    for k, i in groupindex.items():
+        indexgroup[i] = k
+
     return _sre.compile(
         pattern, flags,
         array.array(WORDSIZE, code).tostring(),
-        p.pattern.groups-1, p.pattern.groupdict
+        p.pattern.groups-1, groupindex, indexgroup
         )
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index 81ca217..d78737f 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -515,6 +515,8 @@
                     group = state.getgroup(name)
                 while 1:
                     p = _parse(source, state)
+                    if group is not None:
+                        p.append((INDEX, group))
                     if source.match(")"):
                         if b:
                             b.append(p)