2011-04-15 160 views
7

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

回答

6

最後一次檢查時,他們在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

1

Ruby和Python的正則表達式庫由兩個完全獨立的團隊開發。即使它們現在是相同的(我也不能確定它們是什麼),但不能保證它們在未來某個時候不會發生分歧。

最安全的立場是假設他們現在不同,並且假設他們將來會繼續不同。

5

我喜歡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

2

如果問題只是關於正則表達式:既不。使用Perl。

您應該根據您嘗試解決的其他非正則表達式問題以及該語言附近的社區支持來選擇這些語言。

如果基於正則表達式的支持,你是真正的唯一選擇語言 - 選擇的Perl ...

1

Ruby的Regexp#match方法等同於Python的re.search(),不re.match()re.search()Regexp#match尋找字符串中任意位置的第一個匹配項。 re.match()僅在字符串的開始處查找匹配項。

要執行re.match()的等效操作,Ruby正則表達式需要以^開頭,表示匹配字符串的開頭。

要執行相當於Regexp#match的Python正則表達式,需要以.*開頭,表示匹配零個或多個字符。