- 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.
This commit is contained in:
Fredrik Lundh 2000-07-02 22:25:39 +00:00
parent c9c02c4cf3
commit c2301730b8
4 changed files with 38 additions and 13 deletions

View File

@ -298,8 +298,14 @@ def compile(p, flags=0):
assert p.pattern.groups <= 100,\ assert p.pattern.groups <= 100,\
"sorry, but this version only supports 100 named groups" "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( return _sre.compile(
pattern, flags, pattern, flags,
array.array(WORDSIZE, code).tostring(), array.array(WORDSIZE, code).tostring(),
p.pattern.groups-1, p.pattern.groupdict p.pattern.groups-1, groupindex, indexgroup
) )

View File

@ -515,6 +515,8 @@ def _parse(source, state):
group = state.getgroup(name) group = state.getgroup(name)
while 1: while 1:
p = _parse(source, state) p = _parse(source, state)
if group is not None:
p.append((INDEX, group))
if source.match(")"): if source.match(")"):
if b: if b:
b.append(p) b.append(p)

View File

@ -1104,9 +1104,10 @@ _compile(PyObject* self_, PyObject* args)
PyObject* code; PyObject* code;
int groups = 0; int groups = 0;
PyObject* groupindex = NULL; PyObject* groupindex = NULL;
if (!PyArg_ParseTuple(args, "OiO!|iO", &pattern, &flags, PyObject* indexgroup = NULL;
if (!PyArg_ParseTuple(args, "OiO!|iOO", &pattern, &flags,
&PyString_Type, &code, &PyString_Type, &code,
&groups, &groupindex)) &groups, &groupindex, &indexgroup))
return NULL; return NULL;
self = PyObject_NEW(PatternObject, &Pattern_Type); self = PyObject_NEW(PatternObject, &Pattern_Type);
@ -1127,6 +1128,9 @@ _compile(PyObject* self_, PyObject* args)
Py_XINCREF(groupindex); Py_XINCREF(groupindex);
self->groupindex = groupindex; self->groupindex = groupindex;
Py_XINCREF(indexgroup);
self->indexgroup = indexgroup;
return (PyObject*) self; return (PyObject*) self;
} }
@ -1883,7 +1887,28 @@ match_getattr(MatchObject* self, char* name)
PyErr_Clear(); PyErr_Clear();
/* attributes */ if (!strcmp(name, "lastindex")) {
/* experimental */
if (self->index >= 0)
return Py_BuildValue("i", self->index);
Py_INCREF(Py_None);
return Py_None;
}
if (!strcmp(name, "lastgroup")) {
/* experimental */
if (self->pattern->indexgroup) {
PyObject* result = PySequence_GetItem(
self->pattern->indexgroup, self->index
);
if (result)
return result;
PyErr_Clear();
}
Py_INCREF(Py_None);
return Py_None;
}
if (!strcmp(name, "string")) { if (!strcmp(name, "string")) {
Py_INCREF(self->string); Py_INCREF(self->string);
return self->string; return self->string;
@ -1900,15 +1925,6 @@ match_getattr(MatchObject* self, char* name)
if (!strcmp(name, "endpos")) if (!strcmp(name, "endpos"))
return Py_BuildValue("i", 0); /* FIXME */ return Py_BuildValue("i", 0); /* FIXME */
if (!strcmp(name, "index")) {
/* experimental */
if (self->index < 0) {
Py_INCREF(Py_None);
return Py_None;
} else
return Py_BuildValue("i", self->index);
}
PyErr_SetString(PyExc_AttributeError, name); PyErr_SetString(PyExc_AttributeError, name);
return NULL; return NULL;
} }

View File

@ -21,6 +21,7 @@ typedef struct {
PyObject* code; /* link to the code string object */ PyObject* code; /* link to the code string object */
int groups; int groups;
PyObject* groupindex; PyObject* groupindex;
PyObject* indexgroup;
/* compatibility */ /* compatibility */
PyObject* pattern; /* pattern source (or None) */ PyObject* pattern; /* pattern source (or None) */
int flags; /* flags used when compiling pattern source */ int flags; /* flags used when compiling pattern source */