regular online ignorecase examples example escape python regex parsing pcre

python - ignorecase - regular expression online



Expresión regular compatible Perl(PCRE) en Python (3)

Tengo que analizar algunas cadenas basadas en PCRE en Python, y no tengo idea de cómo hacerlo.

Las cadenas que quiero analizar parecen:

match mysql m/^./0/0/0/n(4/.[-./w]+)/0.../0/s p/MySQL/ i/$1/

En este ejemplo, tengo que obtener estos artículos diferentes:

"m/^./0/0/0/n(4/.[-./w]+)/0.../0/s" ; "p/MySQL/" ; "i/$1/"

Lo único que he encontrado relacionado con la manipulación de PCRE en Python es este módulo: http://pydoc.org/2.2.3/pcre.html (pero está escrito que es un archivo .so ...)

¿Sabes si existe algún módulo de Python para analizar este tipo de cadena?


Tenga especial cuidado con los no-ASCII en Python

Hay algunos problemas realmente sutiles con la forma en que Python trata, o no puede tratar con, los que no son ASCII en patrones y cadenas. Peor aún, estas disparidades varían sustancialmente de acuerdo, no solo con la versión de Python que está usando, sino también si tiene una "compilación amplia".

En general, cuando estás haciendo cosas Unicode, Python 3 con una construcción amplia funciona mejor y Python 2 con una estructura estrecha funciona peor, pero todas las combinaciones todavía están muy lejos de cómo funcionan las expresiones regulares de Perl en comparación con Unicode . Si buscas patrones in en Python, es posible que tengas que mirar un poco más lejos que su antiguo módulo de memoria.

Los molestos problemas de "amplia construcción" finalmente se han solucionado de una vez por todas, siempre que utilice una versión suficientemente avanzada de Python. Aquí hay un extracto de las notas de la versión v3.3 :

Funcionalidad

Los cambios introducidos por PEP 393 son los siguientes:

  • Python ahora siempre admite la gama completa de puntos de código Unicode, incluidos los que no son BMP (es decir, desde U + 0000 a U + 10FFFF). La distinción entre compilaciones estrechas y anchas ya no existe y Python ahora se comporta como una compilación amplia, incluso bajo Windows.
  • Con la muerte de construcciones estrechas, los problemas específicos de construcciones estrechas también se han corregido, por ejemplo:
    • len() ahora siempre devuelve 1 para caracteres que no sean BMP, por lo len(''/U0010FFFF'') == 1 ;
    • los pares de sustitución no se recombinan en literales de cadena, entonces ''/uDBFF/uDFFF'' != ''/U0010FFFF'' ;
    • indexar o cortar caracteres no BMP devuelve el valor esperado, por lo que ''/U0010FFFF''[0] ahora devuelve ''/U0010FFFF'' y no ''/uDBFF'' ;
    • todas las otras funciones en la biblioteca estándar ahora manejan correctamente los puntos de código que no son BMP.
  • El valor de sys.maxunicode ahora es siempre 1114111 (0x10FFFF en hexadecimal). La función PyUnicode_GetMax() aún devuelve 0xFFFF o 0x10FFFF para compatibilidad con versiones anteriores, y no debe usarse con la nueva API Unicode (vea el problema 13054 ).
  • The ./configure ha eliminado el indicador The ./configure --with-wide-unicode .

El futuro de los recusos de Python

A diferencia de lo que actualmente está disponible en la biblioteca de re de distribución estándar de Python, el módulo de regex Matthew Barnett para Python 2 y Python 3 es mucho, mucho mejor en casi todas las formas posibles y muy probablemente reemplazará eventualmente. Su particular relevancia para su pregunta es que su biblioteca de expresiones regex es mucho más ᴘᴄʀᴇ ( es decir , es mucho más compatible con Perl ) en todos los aspectos que ahora, lo que hará que sea más fácil para usted portar expresiones regulares de Perl a Python. Debido a que es una reescritura básica (como en scratch, no como en hamburguesa :), se escribió con no ASCII en mente, que no era.

Por lo tanto, la biblioteca de expresiones regulares sigue mucho más de cerca las recomendaciones (actuales) de UTS # 18: Expresiones regulares Unicode en cómo se acerca a las cosas. Cumple o excede los requisitos de nivel 1 de UTS # 18 en la mayoría, si no en todos los aspectos, algo por lo que normalmente debe usar la biblioteca de expresiones regenta de la ICU o el propio Perl, o si es especialmente valiente, la nueva actualización de Java 7 para sus expresiones regulares, como eso también se ajusta a los requisitos de nivel uno de UTS # 18.

Más allá de cumplir con esos requisitos de nivel uno, que son absolutamente esenciales para el soporte básico de Unicode, pero que no se cumplen con la biblioteca actual de Python, la impresionante biblioteca de RL2.5 regex también cumple con los requisitos del nivel dos para RL2.5 nombre RL2.5 ( /N{...}) ), RL2.2 Clústeres de RL2.2 extendidos ( /X ) y el nuevo RL2.7 en Propiedades completas de la revisión 14 de UTS # 18 .

El módulo regex de Matthew también realiza plegado de cajas Unicode para que las coincidencias insensibles a las mayúsculas y minúsculas funcionen de manera confiable en Unicode, lo que no ocurre.

Lo siguiente ya no es cierto, porque regex ahora es compatible con plegado de plegado Unicode completo, como Perl y Ruby.

Una diferencia súper pequeña es que, por ahora, los patrones insensibles a mayúsculas / minúsculas de Perl utilizan pliegues orientados a cuerdas completos, mientras que su módulo regex aún usa pliegues simples orientados a un solo char, pero esto es algo que está investigando. En realidad es un problema muy difícil, uno que aparte de Perl, solo Ruby lo intenta.

En plegado completo, esto significa que (por ejemplo) "ß" ahora correctos coincide con "SS" , "ss" , "ſſ" , "ſs" (etc.) cuando se selecciona la concordancia de mayúsculas y minúsculas. (Esto es más importante en el guión griego que en el latín).

Ver también el código fuente de slides o doc de mi tercera charla OSCON2011 titulada " Unicode Support Shootout: Lo bueno, lo malo y lo (sobre todo) lo feo " para cuestiones generales en soporte Unicode en JavaScript, PHP, Go, Ruby, Python, Java y Perl. Si no puede usar expresiones regulares de Perl o posiblemente la biblioteca de expresiones regulares de la ICU (que no tiene capturas con nombre, ¡ay!), Entonces la regex de Matthew para Python es probablemente la mejor opción.

Nᴏᴛᴀ Bᴇɴᴇ s.ᴠ.ᴘ. (= s''il vous plaît, et même s''il ne vous plaît pas :) El siguiente autorizador de la biblioteca de expresiones regulares de Python no colocó aquí la siguiente no solicitada no comercial no solicitada. :)

Cool regex Features

La biblioteca de expresiones regex Python tiene una cornucopeia de características de superneat , algunas de las cuales no se encuentran en ningún otro sistema de expresiones regulares en ninguna parte. Esto hace que valga la pena comprobarlo, sin importar si lo está utilizando por su ᴘᴄʀᴇ-ness o su compatibilidad estelar con Unicode.

Algunas de las características sobresalientes de interés de este módulo son:

  • Ancho variable de aspecto detrás , una característica que es bastante rara en los motores de expresiones regulares y muy frustrante para no tener cuando realmente lo desee. Esta bien puede ser la característica más solicitada en expresiones regulares.
  • Realice una búsqueda hacia atrás para que no tenga que invertir la secuencia usted mismo primero.
  • Opciones de ismx tipo ismx , por lo que (?i:foo) solo se pliega para foo, no en general, o (?-i:foo) para desactivarlo solo en foo. Así es como funciona Perl (o puede).
  • Concordancia difusa basada en la distancia de edición (que también tienen la agrep y la glimpse Udi Manber)
  • Las listas nombradas ordenadas más cortas a las más largas a través de la interpolación /L<list>
  • Metacaracteres que coinciden específicamente solo con el inicio o solo el final de una palabra en lugar de cada lado ( /m , /M )
  • Soporte para todos los separadores de línea Unicode (Java puede hacer esto, al igual que Perl, aunque a regañadientes con /R por RL1.6 .
  • Operaciones de conjunto completo - unión, intersección, diferencia y diferencia simétrica - en clases de caracteres entre corchetes por RL1.3 , lo cual es mucho más fácil que obtenerlo en Perl.
  • Permite grupos de captura repetidos como (/w+/s+)+ donde puede obtener todas las coincidencias separadas del primer grupo, no solo su última coincidencia. (Creo que C # también podría hacer esto).
  • Una forma más directa de conseguir coincidencias superpuestas que grupos de captura furtivos en lookaheads.
  • Las posiciones de inicio y fin de todos los grupos para las operaciones posteriores de segmentación / subcadena, al igual que las matrices @+ y @- Perl.
  • El operador de reinicio de bifurcación a través de (?|...|...|...|) para restablecer la numeración de grupos en cada bifurcación de la misma manera que funciona en Perl.
  • Puede configurarse para que su café lo espere por la mañana.
  • Soporte para los límites de palabras más sofisticados de RL2.3 .
  • Asume cadenas Unicode por defecto, y admite completamente RL1.2a para que /w , /b , /s , y tal trabajo en Unicode.
  • Admite /X para grafemas.
  • Admite la aserción del punto de continuación /G
  • Funciona correctamente para compilaciones de 64 bits ( re solo tiene índices de 32 bits).
  • Admite multihilo.

Ok, eso es suficiente bombo. :)

Sin embargo, otro motor alternativo Regex fino

Una última alternativa que vale la pena analizar si es un geek de expresiones regulares es la vinculación de la biblioteca Python a la impresionante biblioteca RE2 de Russ Cox. También es compatible con Unicode de forma nativa, incluido el plegado de mayúsculas y minúsculas basado en caracteres, y a diferencia de las características de caracteres generales Unicode y Script Unicode, que son las dos propiedades clave que más a menudo necesita para los tipos más simples de procesamiento Unicode.

Aunque RE2 se pierde en algunas características de Unicode como /N{...} nombre de soporte de caracteres que se encuentra en ICU, Perl y Python, tiene ventajas de cómputo extremadamente serias que lo convierten en el motor de expresiones regulares de elección cada vez que se preocupe por la inanición Ataques de denegación de servicio basados ​​a través de expresiones regulares en consultas web y tal. Lo logra al prohibir las referencias retrospectivas, que hacen que una expresión regular deje de ser regular y expone a explosiones superexponenciales en el tiempo y el espacio.

Los enlaces de biblioteca para RE2 están disponibles no solo para C / C ++ y Python, sino también para Perl y más especialmente para Go, donde está programado para reemplazar muy pronto la biblioteca de expresiones regulares estándar allí.


Dado que desea ejecutar expresiones regulares de PCRE, y el módulo de re de Python se ha separado de sus orígenes PCRE originales, es posible que también desee verificar las vinculaciones de Python de Arkadiusz Wahlig para PCRE . De esta forma, tendrá acceso a PCRE nativo y no tendrá que traducir entre los sabores de expresiones regulares.


Está buscando ''(/w/[^/]+//w*)'' .

Usado así,

import re x = re.compile(''(/w/[^/]+//w*)'') s = ''match mysql m/^./0/0/0/n(4/.[-./w]+)/0.../0/s p/MySQL/ i/$1/'' y = x.findall(s) # y = [''m/^./x00/x00/x00/n(4//.[-.//w]+)/x00.../x00/s'', ''p/MySQL/'', ''i/$1/'']

Lo encontré mientras jugaba con el Entrenador Regex de Edi Weitz, así que gracias a los comentarios a la pregunta que me hicieron recordar su existencia.