【问题标题】:Ruby Regex vs Python RegexRuby 正则表达式与 Python 正则表达式
【发布时间】:2011-08-06 00:17:18
【问题描述】:

Ruby regex 和 Python regex 之间有什么真正的区别吗?

我无法找到两者之间的任何差异,但可能遗漏了一些东西。

【问题讨论】:

  • 嗯?你想“找到”什么?正则表达式本身是一种语言,因此该库可能有一些不同的标志,但总体而言,所有支持它的语法都是相同的。
  • Ruby1.8 还是 Ruby1.9?那里有很大的不同。
  • 相反,Ruby1.9 和 PHP5 应该是一样的,因为它们采用了相同的 oniguruma 引擎。
  • 我很确定两者都没有良好的正则表达式调试支持。

标签: python ruby regex


【解决方案1】:

我上次检查时,它们在 Unicode 支持方面存在很大差异。 Ruby 在 1.9 中至少有一些非常有限的 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 至少有几个库。我不知道它们是标准的。

但说到正则表达式支持,嗯,还有比这两个更丰富的选择,你知道的。 :)

【讨论】:

  • 我认为 ruby​​ 正则表达式支持自您上次检查以来变得更加强大:github.com/ruby/ruby/blob/trunk/doc/re.rdoc
  • @steenslag 不,Ruby 正则表达式仍然不适合 Unicode。 Charclass 缩写仍然与 RL1.2a 格格不入,停留在过去的 ASCII 沙子中。与 POSIX 道具相同。像 \p{lower} 这样的东西与 Unicode 标准存在根本冲突,Unicode 标准规定它必须全部小写,而不仅仅是字母。除此之外,仅支持两个属性:General_Category 和 Script 属性。不支持通过\X 或等价的字素集群。没有\N{NAME} 支持。它缺少 1 级的其余内容,这是可接受的最低 Unicode 支持级别。
  • @steenslag:考虑一下这个完全合理的模式,而且确实是非常普遍需要的模式,用于匹配一个字素簇——一个用户感知的字符——有“a”和一个抑扬符,但你不知道在哪里首先是规范化形式,您希望全角“a”等匹配,以及其他标记可以落在它们之间:NFKD($s) =~ / (?= a \p{Grapheme_Extend}* \N{COMBINING CIRCUMFLEX ACCENT} ) \X /ix。我如何在 Ruby 中做到这一点? Ruby 和 Python 都无法满足UTS#18 on Unicode Regexes 的MINIMAL 要求。 现在看?
  • 在这种情况下,我不是一个很好的讨论伙伴——我不得不在维基百科中找到你的大部分关键词。但是你对 OP、ruby 还是 python 有什么建议呢?
  • @steenstag:什么用 Ruby 还是 Python?常用表达?两者都需要我无法接受的妥协。我必须能够使用 Unicode。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    您应该根据您正在尝试解决的其他非正则表达式问题以及您所在领域附近的该语言的社区支持在这些语言之间进行选择。

    如果您真的只是选择基于正则表达式支持的语言——选择 Perl...

    【讨论】:

      【解决方案4】:

      我喜欢 Ruby 中的 /pattern/ 语法,它受 Perl 的启发,用于正则表达式。 Python 的 re.compile("pattern") 对我来说并不是很优雅。 Ruby 中的语法糖以及正则表达式在 Python 中是一个单独的 re 模块这一事实,让我在正则表达式方面倾向于 Ruby。

      除此之外,我看不出与正常的正则表达式编程角度有太大区别。两种语言都具有相当全面且大部分相似的 RE 支持。可能存在性能差异(Python 传统上具有更好的性能)并且 Python 具有更好的 unicode 正则表达式支持。

      【讨论】:

      • Python 支持多少the standard Unicode properties?另外,Python 对proper grapheme clusters 的支持是如何实现的,比如通过\X 或者通过\p{Grapheme_Base}\p{Grapheme_Extend}*?它是否对不区分大小写的匹配进行完整的 1:many Unicode 大小写折叠?您能否可靠地使用任何可能的 Unicode 代码点,或者您仍然受到 BMP 限制(Unicode 禁止,ahem)的束缚?顺便说一句,我只是在开玩笑,不要太认真。
      • 我非常同意你的观点,将正则表达式与核心语言紧密耦合,而不是与库放在一起,这对可用性有很大的影响。
      【解决方案5】:

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

      最安全的位置是假设它们现在不同,并假设它们将来会继续不同。

      【讨论】:

        猜你喜欢
        • 2010-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-04
        • 2016-08-18
        • 2012-10-17
        • 1970-01-01
        • 2015-12-29
        相关资源
        最近更新 更多