2011-04-15 12 views
7

¿Hay alguna diferencia real entre Ruby regex y Python regex?Ruby Regex vs Python Regex

No he podido encontrar ninguna diferencia en los dos, pero puede haber perdido algo.

+0

hmm? ¿Qué estás tratando de "encontrar"? La expresión regular en sí misma es un lenguaje, por lo que la biblioteca puede tener banderas un poco diferentes, pero en general la sintaxis es la misma entre todo lo que la admite. – OneOfOne

+1

Ruby1.8 o Ruby1.9? Hay una gran diferencia allí. – sawa

+3

Ver - http://www.regular-expressions.info/refflavors.html – YOU

Respuesta

6

La última vez que revisé, diferían sustancialmente en su compatibilidad con Unicode. Ruby en 1.9 al menos tiene un soporte Unicode muy limitado. Creo que una o dos propiedades Unicode podrían ser compatibles por ahora. Probablemente las categorías generales y tal vez los guiones fueran los dos en los que estoy pensando.

Python tiene menos y más compatibilidad con Unicode al mismo tiempo. Python parece hacer posible cumplir con los requisitos de RL1.2a "Compatability Properties" de UTS # 18 en Unicode Regular Expressions.

Dicho esto, Matthew Barnett (mrab) tiene una biblioteca de Python realmente bonita que finalmente agrega un par de propiedades Unicode a las expresiones regulares de Python. Él es compatible con los dos más importantes: las categorías generales y las propiedades del script. También tiene otras características intrigantes. Merece una buena publicidad.

No creo que ni Ruby ni Python soporten Unicode todo tan terriblemente bien, aunque se hace más y más cada día. En particular, sin embargo, ninguno cumple ni siquiera el requisito básico del Nivel 1 para Unicode Regular Expressions citado anteriormente. Por ejemplo, RL1.2 requiere que se admitan al menos 11 propiedades: General_Category, Script, Alphabetic, Uppercase, Lowercase, White_Space, Noncharacter_Code_Point, Default_Ignorable_Code_Point, ANY, ASCII, y ASSIGNED.

Creo que Python solo te permite llegar a algunos de ellos, y solo de una manera indirecta. Por supuesto, hay muchas, muchas otras propiedades más allá de estas 11.

Cuando está buscando soporte Unicode, hay más que solo UTS # 10 en expresiones regulares, por supuesto, aunque eso es lo que más le importa a este pregunta y ni Ruby ni Puython cumplen el Nivel 1. Otros aspectos muy importantes de Unicode incluyen UAX # 15, UAX # 14, UTS # 18, UAX # 11, UAX # 29, y por supuesto el crucial UAX # 44. Python tiene bibliotecas para al menos un par de ellas, lo sé. No sé si son estándar.

Pero cuando se trata de soporte para expresiones regulares, um, hay son alternativas más ricas que solo esas dos, ya sabes. :)

+0

Creo que el soporte de Ruby Regex se ha vuelto mucho más poderoso desde la última vez que lo verificó: https://github.com/ruby/ruby/blob/trunk/doc/re.rdoc – steenslag

+0

@steenslag No, las expresiones regulares de Ruby siguen siendo asquerosas en Unicode. Las abreviaturas de Charclass todavía están lastimosamente fuera de sintonía con RL1.2a, estancadas en las arenas ASCII de antaño. Lo mismo con los accesorios POSIX. Y cosas como '\ p {lower}' están en conflicto radical con el estándar Unicode, que dice que debe ser todo en minúscula, no solo letras. Más allá de eso, solo se admiten dos propiedades: General_Category y Script properties. No hay soporte para clústeres de grafemas a través de '\ X' o equiv. No hay compatibilidad con '\ N {NAME}'. Falta el resto del material para el Nivel 1, el nivel más bajo aceptable de soporte Unicode. – tchrist

+0

@steenslag: Considere este patrón totalmente razonable, y de hecho muy comúnmente necesario, para hacer coincidir un clúster de grafema -un carácter percibido por el usuario- que tiene "a" y un circunflejo, pero donde primero no conoce la forma de normalización, donde querer fullwidth "a" y tal para coincidir, y donde otras marcas pueden caer entre ellos: 'NFKD ($ s) = ~/(? = a \ p {Grapheme_Extend} * \ N {COMBINING CIRCUMFLEX ACCENT}) \ X/ix'. ¿Cómo hago eso en Ruby?Ni Ruby ni Python pueden siquiera acercarse a cumplir los requisitos ** MÍNIMO ** de [UTS # 18 en Unicode Regexes] (http://unicode.org/reports/tr18/). * ¿Ver ahora? * – tchrist

1

Las bibliotecas de expresiones regulares para Ruby y Python son desarrolladas por dos equipos completamente independientes. Incluso si ahora son idénticos (y no estoy seguro de que lo sean), no hay garantía de que no divergirán alguna vez en el futuro.

La posición más segura es suponer que son diferentes ahora, y asumir que seguirán siendo diferentes en el futuro.

5

Me gusta el/patrón/sintaxis en Ruby, inspirado en Perl, para expresiones regulares. Python's re.compile ("patrón") no es realmente elegante para mí. El azúcar sintáctico en Ruby y el hecho de que las expresiones regulares son un módulo de memoria separado en Python, me hace inclinarme hacia Ruby cuando se trata de expresiones regulares.

Aparte de esto, no veo mucha diferencia con una perspectiva de programación de expresión regular normal. Ambos lenguajes tienen un soporte ER bastante amplio y en su mayoría similar. Puede haber diferencias de rendimiento (Python tradicionalmente tiene un mejor rendimiento) y también Python tiene mayor soporte de expresiones regulares unicode.

+0

¿Cuántas de [la norma Propiedades Unicode] (http://unicode.org/reports/tr44/#Property_Index) ¿Admite Python? Además, ¿cómo está el soporte de Python para [clusters de grafemas apropiados] (http://unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table), como a través de '\ X' o quizás a través de' \ p {Grapheme_Base} \ p {Grapheme_Extend } * '? ¿Lo hace completo 1: muchas plegadoras de cajas Unicode para cerillas insensibles a mayúsculas y minúsculas? ¿Puede utilizar de manera confiable cualquier posible punto de código Unicode, o todavía está bloqueado por esa restricción BMP (que Unicode prohíbe, * ejem *)? Por cierto, solo te estoy engañando, no te lo tomes demasiado en serio. – tchrist

+4

Estoy totalmente de acuerdo con usted en que tener expresiones regulares estrechamente relacionadas con el idioma central en lugar de estar clavadas en el lado con una biblioteca hace una gran diferencia en la usabilidad. – tchrist

2

Si la pregunta es solo acerca de regex: ninguno. Usa Perl.

Debe elegir entre los idiomas basados ​​en los otros problemas no regex que está tratando de resolver y el apoyo de la comunidad en ese idioma que se encuentra cerca de su campo de actividad.

Si está verdaderamente única recogiendo un lenguaje basado en el apoyo de expresiones regulares - elegir Perl ...

1

método de Ruby Regexp#match es equivalente a Python de re.search(), no re.match(). re.search() y Regexp#match busque la primera coincidencia en cualquier lugar de una cadena. re.match() busca una coincidencia solo al comienzo de una cadena.

Para realizar el equivalente a re.match(), una expresión regular de Ruby deberá comenzar con un ^, indicando que coincide con el comienzo de la cadena.

Para realizar el equivalente a Regexp#match, una expresión regular de Python deberá comenzar con .*, indicando que coinciden cero o más caracteres.