2011-04-15 6 views
7

Existe-t-il de réelles différences entre Ruby regex et Python regex?Ruby Regex vs Python Regex

J'ai été incapable de trouver des différences dans les deux, mais peut avoir manqué quelque chose.

+0

hmm? qu'essayez-vous de "trouver"? regex lui-même est un langage, donc la bibliothèque peut avoir des drapeaux un peu différents mais globalement la syntaxe est la même entre tout ce qui la supporte. – OneOfOne

+1

Ruby1.8 ou Ruby1.9? Il y a une énorme différence là-bas. – sawa

+3

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

Répondre

6

La dernière fois que j'ai vérifié, ils différaient considérablement dans leur support Unicode. Ruby dans 1.9 au moins a un support Unicode très limité. Je crois qu'une ou deux propriétés Unicode pourraient être supportées par maintenant. Probablement les catégories générales et peut-être les scénarios étaient les deux auxquels je pense.

Python a de moins en moins de support Unicode en même temps. Python semble permettre de répondre aux exigences de RL1.2a "Compatability Properties" de l'UTS # 18 sur Unicode Regular Expressions. Cela dit, Matthew Barnett (mrab) a créé une bibliothèque Python vraiment sympa qui ajoute finalement quelques propriétés Unicode aux regex Python. Il supporte les deux plus importants: les catégories générales et les propriétés du script. Il a aussi d'autres caractéristiques intrigantes. Cela mérite une bonne publicité.

Je ne pense pas que Ruby ou Python supporte très bien Unicode, bien que de plus en plus de choses soient faites tous les jours. En particulier, cependant, ni l'un ni l'autre ne satisfait aux exigences de niveau 1 du barebone pour les expressions régulières Unicode citées ci-dessus. Par exemple, RL1.2 requiert qu'au moins 11 propriétés soient prises en charge: General_Category, Script, Alphabetic, Uppercase, Lowercase, White_Space, Noncharacter_Code_Point, Default_Ignorable_Code_Point, ANY, ASCII, et ASSIGNED.

Je pense que Python ne vous permet d'accéder qu'à certains d'entre eux, et seulement de façon détournée. Bien sûr, il y a beaucoup, beaucoup d'autres propriétés au-delà de ces 11.

Lorsque vous cherchez un support Unicode, bien sûr, il y a bien plus que l'UTS # 10 sur les expressions régulières, bien que ce soit celui qui compte le plus question et ni Ruby ni Puython ne sont conformes au niveau 1. D'autres aspects très importants d'Unicode incluent UAX # 15, UAX # 14, UTS # 18, UAX # 11, UAX # 29, et bien sûr l'UAX # 44 crucial. Python a des bibliothèques pour au moins quelques-unes, je sais. Je ne sais pas s'ils sont standards.

Mais quand il s'agit de support d'expression régulière, um, il sont alternatives plus riches que seulement ces deux, vous savez. :)

+0

Je pense que la prise en charge de ruby ​​regex est devenue beaucoup plus puissante depuis la dernière vérification: https://github.com/ruby/ruby/blob/trunk/doc/re.rdoc – steenslag

+0

@steenslag Non, les expressions rationnelles Ruby sont toujours très mauvaises pour Unicode. Les abréviations Charclass sont encore pitoyablement décalées avec RL1.2a, coincé dans les sables ASCII d'antan. Pareil avec les accessoires POSIX. Et des choses comme '\ p {lower}' sont en conflit radical avec la norme Unicode, qui dit que tout doit être en minuscules, pas seulement des lettres. Au-delà, seules deux propriétés sont prises en charge: General_Category et les propriétés du script. Il n'y a pas de support pour les grappes de graphèmes via '\ X' ou equiv. Il n'y a pas de support '\ N {NAME}'. Il manque le reste des choses pour le niveau 1, le plus bas niveau acceptable de support Unicode. – tchrist

+0

@steenslag: Considérez ce schéma totalement raisonnable, et en fait très souvent nécessaire, pour faire correspondre un cluster graphème - un caractère perçu par l'utilisateur - qui a "a" et un circonflexe, mais où vous ne connaissez pas le formulaire de normalisation d'abord, où vous veulent que les "a" de fullwidth et autres correspondent, et où d'autres marques peuvent tomber entre eux: 'NFKD ($ s) = ~/(? = a \ p {Graphème_Extend} * \ N {COMBINER L'ACCENT CIRCUMFLEX}) \ X/ix'. Comment je fais ça chez Ruby?Ruby ni Python ne peuvent même pas répondre aux exigences ** MINIMAL ** de [UTS # 18 sur Unicode Regexes] (http://unicode.org/reports/tr18/). * Voir maintenant? * – tchrist

1

Les bibliothèques d'expressions régulières pour Ruby et Python sont développées par deux équipes complètement indépendantes. Même s'ils sont identiques maintenant (et je ne serais pas certain qu'ils le sont), il n'y a aucune garantie qu'ils ne divergent pas dans le futur.

La position la plus sûre est de supposer qu'ils sont différents maintenant, et de supposer qu'ils continueront à être différents dans le futur.

5

J'aime le/pattern/syntaxe de Ruby, inspiré de Perl, pour les expressions régulières. Le fichier re.compile de Python ("pattern") n'est pas vraiment élégant pour moi. Le sucre syntaxique dans Ruby et le fait que les expressions régulières sont un module séparé en Python, me fait pencher vers Ruby quand il s'agit d'Expressions Régulières. En dehors de cela, je ne vois pas beaucoup de différence par rapport à une perspective de programmation d'expressions régulières normale. Les deux langues ont un support RE assez complet et similaire. Il pourrait y avoir des différences de performances (Python a traditionnellement de meilleures performances) et Python a aussi un plus grand support des expressions régulières Unicode.

+0

Combien de [la norme Propriétés Unicode] (http://unicode.org/reports/tr44/#Property_Index) prend-il en charge Python? En outre, comment Python prend-il en charge [les grappes de graphèmes appropriées] (http://unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table), comme via \ X ou peut-être via \ p {Grapheme_Base} \ p {Grapheme_Extend } * '? Fait-il plein 1: de nombreux pliages Unicode pour des correspondances insensibles à la casse? Pouvez-vous utiliser de manière fiable tout point de code Unicode possible, ou êtes-vous encore paralysé par cette restriction BMP (que Unicode interdit, * ahem *)? BTW, je ne fais que te côtoyer, ne le prends pas trop au sérieux. – tchrist

+4

Je suis tout à fait d'accord avec vous que le fait d'avoir des expressions rationnelles étroitement couplées au langage de base au lieu d'être cloué sur le côté avec une bibliothèque fait une grande différence dans l'utilisabilité. – tchrist

2

Si la question concerne seulement les regex: ni. Utilisez Perl.

Vous devez choisir entre ces langues en fonction des autres problèmes non-regex que vous essayez de résoudre et du support de la communauté dans cette langue qui se trouve à proximité de votre domaine d'activité.

Si vous êtes vraiment que le choix d'un langage basé sur le soutien regex - choisissez Perl ...

1

méthode de Ruby Regexp#match équivaut à Python re.search(), pas re.match(). re.search() et Regexp#match recherchez la première correspondance n'importe où dans une chaîne. re.match() recherche une correspondance uniquement au début d'une chaîne.

Pour exécuter l'équivalent de re.match(), une expression régulière Ruby doit commencer par ^, indiquant ainsi le début de la chaîne.

Pour exécuter l'équivalent de Regexp#match, une expression régulière Python doit commencer par .*, indiquant qu'il correspond à zéro ou plusieurs caractères.