2017-04-11 41 views
4

我一直在尋找在迴應這個剛纔問個問題:蟒蛇分裂在多個分隔符錯誤?

Split Strings with Multiple Delimiters?

對於我這個問題的變種,我想拆就一切不是來自一組特定字符的。這導致我找到了我喜歡的解決方案,直到我發現這個明顯的錯誤。這是一個錯誤還是我不熟悉的Python的一些怪癖?

>>> b = "Which_of'these-markers/does,it:choose to;split!on?" 
>>> b1 = re.split("[^a-zA-Z0-9_'-/]+", b) 
>>> b1 
["Which_of'these-markers/does,it", 'choose', 'to', 'split', 'on', ''] 

我不理解爲什麼它做一個逗號(「」)不分裂,因爲逗號是在我的例外列表?

+1

可能是因爲'' - /'。它被解釋爲範圍。 – Rahul

回答

7

'-/字符類中創建一個包括一個逗號範圍:

enter image description here

當你需要把一個連字符在Python re模式,把它:

  • 在開頭:[-A-Z](匹配一個大寫ASCII字母和-
  • 最後:[A-Z()-]
  • (大寫ASCII字母,()-匹配)之後的有效範圍:[A-Z-+](相匹配的大寫ASCII字母,-+
  • 或只是逃避它。

你不能把它簡寫後,一個獨立的符號之前的權利(如[\w-+],就會造成人品不好範圍錯誤)。這在.NET和其他一些正則表達式中是有效的,但在Python re中無效。

將連字符放在結尾,或者將其跳過。

使用

re.split(r"[^a-zA-Z0-9_'/-]+", b) 

在Python 2.7,則可能甚至它收縮到

re.split(r"[^\w'/-]+", b) 
+0

不知道像'\ w'這樣的東西是在'[]'裏面工作的。謝謝! –

+0

啊,謝謝!回想起來顯而易見,但不會想到它! :) – dipankar

+2

在Python're'模式中將一個字符'-'放入字符類時,我添加了幾個要注意的事項。儘管這些信息可以在SO上找到,但它似乎分散在不同的答案中。 –

2

'-/被解釋爲具有從39 ascii值至47,其包括,具有ASCII值44範圍。

你必須在開始或結束或字符類別-