python拆分多个分隔符bug?

时间:2017-04-11 17:30:38

标签: python regex python-2.7

我正在查看对此问题的回答:

Split Strings with Multiple Delimiters?

对于这个问题的变体,我想从一组特定的字符中拆分不是的所有内容。这让我得到了一个我喜欢的解决方案,直到我发现了这个明显的错误。这是一个我不熟悉的bug或蟒蛇的怪癖吗?

>>> 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', '']

我不明白为什么没有分开逗号(&#39;,&#39;),因为逗号不< / em>在我的例外列表中?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

'-/被解释为范围为ascii的范围为39到47,其中,的ascii值为44。

您必须将-放在开头或结尾或字符类中。