Ruby正则表达式与Python正则表达式

问题描述:

Ruby正则表达式和Python正则表达式之间是否存在真正的区别?Ruby正则表达式与Python正则表达式

我一直无法找到两者的差异,但可能错过了一些东西。

+0

hmm?你想要“找到”什么?正则表达式本身就是一种语言,所以图书馆可能会有一些不同的标志,但总体来说支持它的所有内容都是相同的。 – OneOfOne 2011-04-15 02:07:56

+1

Ruby1.8或Ruby1.9?那里有很大的差别。 – sawa 2011-04-15 02:08:12

+3

请参阅 - http://www.regular-expressions.info/refflavors.html – YOU 2011-04-15 02:08:29

最后一次检查时,他们在Unicode支持方面差异很大。 1.9中的Ruby至少有一些非常有限的Unicode支持。我相信现在可能会支持一个或两个Unicode属性。可能一般的类别和脚本可能都是我想到的两个。

Python同时支持越来越少的Unicode。 Python似乎能够满足Unicode Regular Expressions上来自UTS#18的RL1.2a "Compatability Properties"的要求。

也就是说,Matthew Barnett(mrab)有一个非常好的Python库,它最终为Python正则表达式添加了一些Unicode属性。他支持两个最重要的:一般类别和脚本属性。它还有其他一些有趣的功能。它值得一些很好的宣传。

我不认为Ruby或Python都支持Unicode,尽管每天都会有越来越多的工作。但是,特别是,即使上面引用的Unicode正则表达式的准则1的要求都不符合。例如,RL1.2要求支持至少11个属性:General_Category, Script, Alphabetic, Uppercase, Lowercase, White_Space, Noncharacter_Code_Point, Default_Ignorable_Code_Point, ANY, ASCII,ASSIGNED

我认为Python只能让你接触到其中的一些,而且只能以迂回的方式。当然,除了这些之外,还有许多其他许多属性11.

当您在寻找Unicode支持时,当然在正则表达式上不仅仅是UTS#10,尽管这对于这一点来说最重要问题,Ruby和Puython都不符合1级标准。 Unicode的其他非常重要的方面包括UAX#15,UAX#14,UTS#18,UAX#11,UAX#29,当然还有至关重要的UAX#44。我知道,Python至少有一些库。我不知道他们是标准的。

但是,当涉及到正则表达式支持时,恩,更丰富的选择,而不仅仅是这两个,你知道。 :)

+0

我认为自上次检查以来,ruby正则表达式支持变得更加强大:https://github.com/ruby/ruby/blob/trunk/doc/re.rdoc – steenslag 2011-04-15 13:40:30

+0

@steenslag不,Ruby正则表达式仍然吸取Unicode。 Charclass缩写仍然与RL1.2a不协调,陷入了昔日的ASCII沙。与POSIX道具一样。像'\ p {lower}'这样的东西与Unicode标准有冲突,它说它必须全部小写,而不仅仅是字母。除此之外,只支持两个属性:General_Category和Script属性。通过'\ X'或equiv不支持字素集群。没有'\ N {NAME}'支持。它缺少1级的其他内容,这是Unicode支持的最低可接受级别。 – tchrist 2011-04-15 20:57:43

+0

@steenslag:考虑这种完全合理的,实际上非常普遍需要的模式,用于匹配字形群集 - 一种用户感知的字符 - 具有“a”和旋律,但是如果您不知道标准化形式,想要全角“a”等匹配,并且其他标记可以落在它们之间:'NFKD($ s)=〜/(?= a \ p {Grapheme_Extend} * \ N {COMBINING CIRCUMFLEX ACCENT})\ X/ix'。我在Ruby中怎么做?Ruby和Python都无法满足[Unicode正规表达式的UTS#18]的** MINIMAL **要求(http://unicode.org/reports/tr18/)。 *现在看?* – tchrist 2011-04-15 21:03:18

Ruby和Python的正则表达式库由两个完全独立的团队开发。即使它们现在是相同的(我也不能确定它们是什么),但不能保证它们在未来某个时候不会发生分歧。

最安全的立场是假设他们现在不同,并且假设他们将来会继续不同。

我喜欢Ruby中的/ pattern/syntax,这是Perl的灵感,适用于正则表达式。 Python的re.compile(“模式”)对我来说不是很优雅。 Ruby中的合成糖以及正则表达式是Python中的一个单独的重新模块,这让我在正则表达式方面倾向于Ruby。

除此之外,我没有看到与正常的正则表达式编程观点有很大区别。这两种语言都有非常全面的,大部分类似的RE支持。可能会有性能差异(Python传统上具有更好的性能),并且Python也支持更多的Unicode正则表达式。

+0

有多少[标准Unicode属性](http://unicode.org/reports/tr44/#Property_Index)是否支持Python?另外,Python如何支持[适当的字形集群](http://unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table),例如通过'\ X'或可能通过'\ p {Grapheme_Base} \ p {Grapheme_Extend } *'?它是否满1:许多Unicode大小写不​​区分大小写的情况下折叠?你能否可靠地使用任何可能的Unicode代码点,还是你仍然受到BMP限制(哪些Unicode禁止,* ahem *)?顺便说一句,我只是在嘲笑你,不要太认真。 – tchrist 2011-04-15 03:35:33

+4

我非常同意你的看法,即将正则表达式与核心语言紧密结合,而不是与库一侧钉在一起,这对可用性有很大的影响。 – tchrist 2011-04-15 03:41:45

如果问题只是关于正则表达式:既不。使用Perl。

您应该根据您尝试解决的其他非正则表达式问题以及该语言附近的社区支持来选择这些语言。

如果基于正则表达式的支持,你是真正的唯一选择语言 - 选择的Perl ...

Ruby的Regexp#match方法等同于Python的re.search(),不re.match()re.search()Regexp#match寻找字符串中任意位置的第一个匹配项。 re.match()仅在字符串的开始处查找匹配项。

要执行re.match()的等效操作,Ruby正则表达式需要以^开头,表示匹配字符串的开头。

要执行相当于Regexp#match的Python正则表达式,需要以.*开头,表示匹配零个或多个字符。