Django/Python Obteniendo "error_message": "repeticiones múltiples" al usar expresiones regulares

Estoy tratando de agregar un filtro de juramento más eficiente a un servicio de chat que tenemos y parece que no puedo hacer que mi expresión regular funcione en mi servidor Django en vivo.

Estoy ejecutando el último Django estable en Python 2.6.7.

Aquí está mi código:

def replacement(match):
    return "*" * len(match.group(0))

def censored_string(cFilter, dirty):
    clean = str(dirty)
    wordList = cFilter.mutations.split(',')
    wordList.sort(key = len)
    wordList.reverse()

    for swear_word in wordList:
        target_word = swear_word.strip()
        result = re.sub("(?i)\\b(("+target_word+"){1,})(s{0,1})\\b",replacement, clean)
        clean = result
    return clean

para que conste: esto funciona usando la configuración de mi servidor local, que puedo confirmar que también usa python 2.6.7 y la misma versión de django, sin embargo, no he hecho mucho django o python desde hace aproximadamente 10 meses y heredé esta configuración de servidor recientemente, si hay algo que me estoy perdiendo por favor hágamelo saber.

la salida del error es la siguiente:

{
    "error_message": "multiple repeat",
    "traceback": ... "result = re.sub(\"(?i)\\\\b(\"+target_word+\"){1,}(s{0,1})\\\\b\",censored_word(target_word), clean)\n\n  File \"/usr/lib/python2.6/re.py\", line 151, in sub\n    return _compile(pattern, 0).sub(repl, string, count)\n\n  File \"/usr/lib/python2.6/re.py\", line 245, in _compile\n    raise error, v # invalid expression\n\nerror: multiple repeat\n"
}

Lo he intentado con y sin codiciosos, etc., pero ahora estoy perdido; cualquier aporte sería muy apreciado.

aclamaciones,

Michael

preguntado el 03 de mayo de 12 a las 09:05

3 Respuestas

No creo que el problema sea con la expresión regular, sino con tu lista de palabras. Es probable que la lista contenga caracteres que se interpreten como caracteres especiales de expresiones regulares. Esto funciona para mí:

#!/usr/bin/python
import re

def replacement(match):
    return "*" * len(match.group(0))

def censored_string(dirty):
    clean = str(dirty)
    wordList = ["fuck", "shit", "damn"]

    for swear_word in wordList:
        target_word = swear_word.strip()
        result = re.sub("(?i)\\b(("+target_word+"){1,})(s{0,1})\\b",replacement, clean)
        clean = result
    return clean

print censored_string("god damn i love bananas and fucking fuckfuck shits")
# god **** i love bananas and fucking ******** *****

Respondido 29 Oct 13, 17:10

brillante: probé con una lista codificada y funcionó. Muchísimas gracias :) - fatua lógica

¿No debería ser eso realmente god **** i love bananas and ****ing ******** *****? - burhan khalid

Podrías ser de esa opinión, pero eso no es lo que dice la expresión regular. OP puede publicar otra pregunta para obtener ayuda con eso;) - cerveza

Ese error de "repetición múltiple" de re literalmente significa que hay más de una directiva de repetición aplicada a la misma expresión en su patrón.

Las directivas de repetición pueden ser *, +, ?, {m}, {m,n}, etc. Si se aplica más de uno de estos a un patrón, obtendrá ese error. De nuevo, lo más probable es que target_word contiene caracteres especiales de expresiones regulares que probablemente olvidó escapar. Utilizar re.escape() hacer exactamente eso y darle otra oportunidad.

IE

result = re.sub("(?i)\\b((" + re.escape(target_word) + "){1,})(s{0,1})\\b", replacement, clean)

Respondido 23 Jul 18, 20:07

Alguien amablemente vote a favor la respuesta anterior de Devy.

Mi propio caso de uso también es con "re" y "Django".

Obtuve el error: "repetición múltiple en la posición 12", mi código inicial como se muestra a continuación:

str_7 = re.findall(r'([\d+]{1,20}[A-Z])',str_7)
## multiple repeat at position 12#

Error arriba ---> (r'([\d+]{1,20} -- No puede tener "\d+" Y {1,20} , ambos juntos.

También re.escape como se sugiere en otra parte, no es la solución ideal: trate de no tener más de una, "directiva de repetición"

Por lo tanto, como en mi caso, el "Operador más" o "Cierre positivo" no debe ser seguido por el "Operador de llave" {m, n}

Respondido 27 Oct 17, 09:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.