diff options
author | Fredrik Lundh <fredrik@pythonware.com> | 2001-10-24 22:16:30 (GMT) |
---|---|---|
committer | Fredrik Lundh <fredrik@pythonware.com> | 2001-10-24 22:16:30 (GMT) |
commit | 703ce8122cadd68a4260318f44725398fc3a383c (patch) | |
tree | f93ce1a12ee954429a3d4dc3e1613f32ce726c72 | |
parent | 9242a4af177c4c62dfacdf633eb1bbdeba273b3c (diff) | |
download | cpython-703ce8122cadd68a4260318f44725398fc3a383c.zip cpython-703ce8122cadd68a4260318f44725398fc3a383c.tar.gz cpython-703ce8122cadd68a4260318f44725398fc3a383c.tar.bz2 |
(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.
-rw-r--r-- | Lib/sre.py | 10 | ||||
-rw-r--r-- | Modules/_sre.c | 28 |
2 files changed, 38 insertions, 0 deletions
@@ -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 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 @@ 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}, |