diff --git a/Lib/sre.py b/Lib/sre.py index e7517f598fc..88b4fabaaf3 100644 --- a/Lib/sre.py +++ b/Lib/sre.py @@ -93,6 +93,7 @@ This module also defines an exception 'error'. """ +import sys import sre_compile import sre_parse @@ -164,6 +165,15 @@ def findall(pattern, string): 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 c520b604f40..c78ed52c421 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 @@ error: } +#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 @@ static PyMethodDef pattern_methods[] = { {"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},