2017-04-11 42 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范围。

你必须在开始或结束或字符类别-