Python在多个分隔符上的split函数是否存在bug?

4
我正在查看之前提出的问题的回答:如何使用多个分隔符拆分字符串? 对于我面临的这个问题,我想根据一组特定字符以外的所有内容进行拆分。这使我找到了一种我喜欢的解决方案,但后来我发现了这个明显的 bug。这是一个 bug 还是我不熟悉的 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
2个回答

7

在字符类中,'-/ 创建了一个范围,其中包含逗号:

enter image description here

当您需要在Python的re模式中放置一个字面连字符时,请将其放置在:

  • 开头:[-A-Z](匹配大写ASCII字母和 -
  • 结尾:[A-Z()-](匹配大写ASCII字母、(, )-
  • 在有效范围之后:[A-Z-+](匹配大写ASCII字母、-+
  • 或者只需转义它。

您不能将其放置在简写后,并紧接着一个独立的符号(如[\w-+]),否则会导致bad character range错误。这在.NET和其他一些正则表达式中是有效的,但在Python的re中无效。

将连字符放在末尾或进行转义。

使用

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

在Python 2.7中,你甚至可以将其缩减为
re.split(r"[^\w'/-]+", b)

不知道像\w这样的东西在[]里也能用。谢谢! - Mad Physicist
啊,谢谢!回想起来很明显,但我没想到! :) - dipankar
2
我在Python的re模式中添加了一些需要注意的事项,当将一个字面上的-放入字符类中时。虽然这些信息可以在SO上找到,但它们似乎分散在不同的答案中。 - Wiktor Stribiżew

2
“-'/”被解释为范围,其ASCII值从39到47,包括ASCII值为44的“,”。您必须将“-”放在字符类的开头或末尾。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接