我正在查看对此问题的回答:
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>在我的例外列表中?
答案 0 :(得分:7)
字符类中的'-/
创建了一个包含逗号的范围:
当您需要在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。
您必须将-
放在开头或结尾或字符类中。