(experimental) "finditer" method/function.  this works pretty much
like findall, but returns an iterator (which returns match objects)
instead of a list of strings/tuples.
diff --git a/Lib/sre.py b/Lib/sre.py
index e7517f5..88b4fab 100644
--- a/Lib/sre.py
+++ b/Lib/sre.py
@@ -93,6 +93,7 @@
 
 """
 
+import sys
 import sre_compile
 import sre_parse
 
@@ -164,6 +165,15 @@
     Empty matches are included in the result."""
     return _compile(pattern, 0).findall(string)
 
+if sys.hexversion >= 0x02020000:
+    def finditer(pattern, string):
+        """Return an iterator over all non-overlapping matches in
+        the string.  For each match, the iterator returns a match
+        object.
+
+        Empty matches are included in the result."""
+        return _compile(pattern, 0).finditer(string)
+
 def compile(pattern, flags=0):
     "Compile a regular expression pattern, returning a pattern object."
     return _compile(pattern, flags)
diff --git a/Modules/_sre.c b/Modules/_sre.c
index c520b60..c78ed52 100644
--- a/Modules/_sre.c
+++ b/Modules/_sre.c
@@ -35,6 +35,7 @@
  * 2001-10-20 fl  added split primitive; reenable unicode for 1.6/2.0/2.1
  * 2001-10-21 fl  added sub/subn primitive
  * 2001-10-22 fl  check for literal sub/subn templates
+ * 2001-10-24 fl  added finditer primitive (for 2.2 only)
  *
  * Copyright (c) 1997-2001 by Secret Labs AB.  All rights reserved.
  *
@@ -1954,6 +1955,30 @@
     
 }
 
+#if PY_VERSION_HEX >= 0x02020000
+static PyObject*
+pattern_finditer(PatternObject* pattern, PyObject* args)
+{
+    PyObject* scanner;
+    PyObject* search;
+    PyObject* iterator;
+
+    scanner = pattern_scanner(pattern, args);
+    if (!scanner)
+        return NULL;
+
+    search = PyObject_GetAttrString(scanner, "search");
+    Py_DECREF(scanner);
+    if (!search)
+        return NULL;
+
+    iterator = PyCallIter_New(search, Py_None);
+    Py_DECREF(search);
+
+    return iterator;
+}
+#endif
+
 static PyObject*
 pattern_split(PatternObject* self, PyObject* args, PyObject* kw)
 {
@@ -2331,6 +2356,9 @@
     {"subn", (PyCFunction) pattern_subn, METH_VARARGS|METH_KEYWORDS},
     {"split", (PyCFunction) pattern_split, METH_VARARGS|METH_KEYWORDS},
     {"findall", (PyCFunction) pattern_findall, METH_VARARGS|METH_KEYWORDS},
+#if PY_VERSION_HEX >= 0x02020000
+    {"finditer", (PyCFunction) pattern_finditer, METH_VARARGS},
+#endif
     {"scanner", (PyCFunction) pattern_scanner, METH_VARARGS},
     {"__copy__", (PyCFunction) pattern_copy, METH_VARARGS},
     {"__deepcopy__", (PyCFunction) pattern_deepcopy, METH_VARARGS},