Error de repetición múltiple de Python

Estoy tratando de determinar si un término aparece en una cadena.
Antes y después del término debe aparecer un espacio, y también se permite un sufijo estándar.
Ejemplo:

term: google string: "I love google!!! " result: found term: dog string: "I love dogs " result: found 

Estoy probando el siguiente código:

 regexPart1 = "\s" regexPart2 = "(?:s|'s|!+|,|.|;|:|\(|\)|\"|\?+)?\s" p = re.compile(regexPart1 + term + regexPart2 , re.IGNORECASE) 

y recibe el error:

 raise error("multiple repeat") sre_constants.error: multiple repeat 

Actualizar
Código real que falla:

 term = 'lg incite" OR author:"http++www.dealitem.com" OR "for sale' regexPart1 = r"\s" regexPart2 = r"(?:s|'s|!+|,|.|;|:|\(|\)|\"|\?+)?\s" p = re.compile(regexPart1 + term + regexPart2 , re.IGNORECASE) 

Por otro lado, el siguiente term pasa suavemente ( + lugar de ++ )

 term = 'lg incite" OR author:"http+www.dealitem.com" OR "for sale' 

El problema es que, en una cadena no cruda, \" es " .

Tienes suerte con todas tus otras barras invertidas no escapadas: \s es lo mismo que \\s , no s ; \( es lo mismo que \\( , no ( , etc.). Pero nunca debes confiar en tener suerte, o suponer que conoces de memoria la lista completa de secuencias de escape de Python.

Imprime tu cadena y escapa de las barras invertidas que se pierden (en mal estado), escapa todas las barras invertidas (OK), o simplemente usa cadenas sin formato en primer lugar (la mejor).


Dicho esto, su expresión regular como publicada no coincidirá con algunas expresiones que debería, pero nunca generará ese error de "multiple repeat" . Claramente, su código real es diferente del código que nos ha mostrado, y es imposible depurar el código que no podemos ver.


Ahora que ha mostrado un caso de prueba real reproducible, ese es un problema aparte .

Estás buscando términos que puedan tener caracteres especiales de expresión regular en ellos, como este:

 term = 'lg incite" OR author:"http++www.dealitem.com" OR "for sale' 

Que p++ en medio de una expresión regular significa “1 o más de 1 o más de la letra p” (en las demás, igual que “1 o más de la letra p”) en algunos idiomas, “siempre falla” en otros, y “levantar una excepción” en otros. El re de Python cae en el último grupo. De hecho, puedes probar esto de forma aislada:

 >>> re.compile('p++') error: multiple repeat 

Si desea colocar cadenas aleatorias en una re.escape , debe llamar a re.escape en ellas.


Un problema más (gracias a Ωmega):

. en una expresión regular significa “cualquier carácter”. Entonces, ,|.|;|:" (Acabo de extraer un fragmento corto de tu cadena de alternancia más larga) significa” una coma, o cualquier carácter, o un punto y coma, o dos puntos “… que es lo mismo que” cualquier personaje “. Probablemente quisiste escapar de la …


Poniendo los tres arreglos juntos:

 term = 'lg incite" OR author:"http++www.dealitem.com" OR "for sale' regexPart1 = r"\s" regexPart2 = r"(?:s|'s|!+|,|\.|;|:|\(|\)|\"|\?+)?\s" p = re.compile(regexPart1 + re.escape(term) + regexPart2 , re.IGNORECASE) 

Como Ωmega también señaló en un comentario, no es necesario usar una cadena de alternaciones si son de un solo carácter; una clase de personajes funcionará igual de bien, de forma más concisa y más fácil de leer.

Y estoy seguro de que hay otras maneras en que esto podría mejorarse.

La otra respuesta es excelente, pero me gustaría señalar que el uso de expresiones regulares para encontrar cadenas en otras cadenas no es la mejor manera de hacerlo. En python simplemente escribe:

  if term in string: #do whatever