2011-11-08 176 views

回答

4

總之,r'[!-\.&]'是寫r'[!-.]'的只是一個複雜的形式。

它的所有通道匹配與ord33 = ord('!')46 = ord('.')之間,aracters即下列任何一項:

!"#$%&\'()*+,-. 

.之前逸出反斜線字符類中被忽略;這是不必要的(.匹配一個字符類中的所有字符都沒有任何意義)。由於和號&已經在字符類中,所以也是多餘的。

+1

所以簡而言之'r'[! - 。]''是一樣的...... –

+0

@FelixKling準確地說。將你的評論複製到答案中。 – phihag

+1

@Eugene Yup。 「字符類」是「一組字符」或「括號內的東西」的正式名稱。 – phihag

0

反斜槓轉義點,範圍因此將從!.。正則表達式匹配:

!"#$%&'()*+,-. 

因爲它包含的範圍,逃避點是不需要的最後&是沒有必要要麼因爲它是一個字符類中。

2

似乎這個正則表達式的意圖是匹配任何字符之間的「!」和「。」 (請注意,斜槓正在轉義「。」字符),它們是! " # $ % & ' () * + , -。 (來自Unicode表格http://www.tamasoft.co.jp/en/general-info/unicode.html)。關於表達

兩點意見:

  1. 通常情況下,你不需要逃避方括號內的字符[](除了,也許,由\本身)。
  2. &符號「&」已包含在由「!-.」定義的範圍內,因此它是多餘的。
+0

1)還有其他字符需要轉義,例如:' - [] ^',具體取決於你放置的位置。2)我認爲字符類可能只匹配'! - 。&',即:'-'不是用來表示一個範圍,而是連字符本身。 – NullUserException

2

測試可能表明該模式匹配chr(33)chr(46),但該模式不能保證在所有系統上以這種方式工作。這是爲什麼。字符集因系統而異。

這就是爲什麼Perl正則表達式文檔特別建議「僅使用從等號([a-e],[A-E])或數字([0-9])的字母開始和結束的範圍。 「(Perl正則表達式是相關的,因爲這是Python使用的正則表達式)。

因此,如果這種模式曾經在基於EBCDIC的平臺上運行,它將匹配一組不同的字符。在基於ASCII的平臺上說模式匹配chr(33)chr(46)是正確的。

+0

您的警告是否適用於UTF-8/16? – eugene

+0

@Eugene:在任何*多字節編碼中使用任何*正則表達式編碼的字節是非常危險的。首先將它們解碼爲unicode。 –

相關問題