(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.
This commit is contained in:
Fredrik Lundh 2001-10-24 22:16:30 +00:00
parent 9242a4af17
commit 703ce8122c
2 changed files with 38 additions and 0 deletions

View File

@ -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)

View File

@ -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},