- 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:
parent
c9c02c4cf3
commit
c2301730b8
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue