No soy consciente de que puede hacer cálculos aritméticos u otros en expresiones regulares. Si hay un motor de expresiones regulares que lo respalde, ¡sería realmente ingenioso! Pero entiendo que eso no sería práctico sin desacelerar enormemente el motor de expresiones regulares.
re.sub(pattern, repl, string[, count, flags])
devolver la cadena de obtenido mediante la sustitución de los sucesos que no se solapan más a la izquierda de patrón en cadena por la sustitución repl. Si no se encuentra el patrón, la cadena se devuelve sin cambios. repl puede ser una cadena o una función; si es una cadena, cualquier fuga de barra invertida se procesa. Es decir, \ n se convierte en un carácter de nueva línea simple, \ r se convierte en un salto de línea , y así sucesivamente. Los escapes desconocidos como \ j se quedan solos. Las referencias hacia atrás, como \ 6, se reemplazan con la subcadena que coincide con grupo 6 en el patrón. Por ejemplo:
>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
... r'static PyObject*\npy_\1(void)\n{',
... 'def myfunc():')
'static PyObject*\npy_myfunc(void)\n{'
Si repl es una función, es llamada para cada ocurrencia no superposición de patrón. La función toma un único argumento de objeto coincidente y devuelve la cadena de reemplazo . Por ejemplo:
>>> def dashrepl(matchobj):
... if matchobj.group(0) == '-': return ' '
... else: return '-'
>>> re.sub('-{1,2}', dashrepl, 'pro----gram-files')
'pro--gram files'
>>> re.sub(r'\sAND\s', ' & ', 'Baked Beans And Spam', flags=re.IGNORECASE)
'Baked Beans & Spam'
El patrón puede ser una cadena o un objeto RE.
El recuento de argumentos opcional es el número máximo de ocurrencias de patrón a reemplazar; count debe ser un entero no negativo. Si se omite o cero, todas las ocurrencias serán reemplazadas. Las coincidencias vacías para el patrón se reemplazan solo cuando no están adyacentes a una coincidencia previa, por lo que sub ('x *', '-', 'abc') devuelve '-a-b-c-'.
Además de escapes de caracteres y referencias hacia atrás como se describe anteriormente, \ g utilizará la subcadena coincidente por el grupo nombrado nombre, como se define por la (? P ...) sintaxis. \ g usa el número de grupo correspondiente ; \ g < 2> es por lo tanto equivalente a \ 2, pero no es ambiguo en un reemplazo como \ g < 2> 0. \ 20 sería interpretado como una referencia al grupo 20, no una referencia al grupo 2 seguido del carácter literal '0'.La referencia posterior \ g < 0> sustituye en toda la subcadena emparejada por el RE.
Puede pasar la función repl como una función que calcula los valores para sustituirlos por la cadena original.
¿De dónde vino la magia codificada 2, también se suponía que debía coincidir con la expresión regular desde el inicio de la segunda línea? – smci
Para el registro, me gustaría señalar que este tipo de característica sería un riesgo de seguridad potencial. Primero es matemática, luego alguien quiere funciones, luego trigonometría o lo que sea, y finalmente alguien descubre un exploit de desbordamiento de pila o algo así. Así que tenga cuidado con lo que deseas. –
¿Riesgo de seguridad? ¿De alguien malicioso corriendo gedit? No lo creo. Si ya están ejecutando gedit, ya pueden hacer cualquier cosa que se pueda hacer sin sudo. – Phob