当前位置: 首页 > 面试题库 >

为什么Python的`re.split()`不会在零长匹配中拆分?

曹浩
2023-03-14
问题内容

rePython中(否则功能非常强大)模块的一个特殊问题是,它re.split()
永远不会在零长度匹配中分割字符串,例如,如果我想沿字边界分割字符串:

>>> re.split(r"\s+|\b", "Split along words, preserve punctuation!")
['Split', 'along', 'words,', 'preserve', 'punctuation!']

代替

['', 'Split', 'along', 'words', ',', 'preserve', 'punctuation', '!']

为什么有这个限制?是设计使然吗?其他正则表达式的味道会这样吗?


问题答案:

这是一个已经做出的设计决定,并且可能会朝着任何方向走。蒂姆·彼得斯(Tim
Peters)发表了这篇文章来解释:

例如,如果您用模式x *拆分“ abc”,您期望什么?模式在4个地方匹配(长度为0),但是我敢打赌大多数人都会惊讶

[‘’,’a’,’b’,’c’,’‘]

返回而不是(因为它们确实得到了)

[‘abc’]

不过,有些人不同意他。Guido van
Rossum不希望由于向后兼容性问题而更改它。他确实说:

我可以添加一个标记来启用此行为。

编辑

Jan Burgy发布了一种解决方法:

>>> s = "Split along words, preserve punctuation!"
>>> re.sub(r"\s+|\b", '\f', s).split('\f')
['', 'Split', 'along', 'words', ',', 'preserve', 'punctuation', '!']

哪里'\f'可以用任何未使用的字符替换。



 类似资料:
  • 到目前为止,我有这个: 和这个: 当我测试这个时,它不能采取双倍数字,我收到这个消息: 我该如何解决这个问题?

  • 问题内容: 我的代码: 输出: 我知道的 : “一个?” 代表零个或一次出现的字符“ a”。 Java API说: matcher.start()返回上一个匹配项的起始索引。 matcher.end()返回匹配的最后一个字符后的偏移量。 matcher.group()返回与上一个匹配项匹配的输入子序列。对于具有输入序列s的匹配器m,表达式m.group()和s.substring(m.start(

  • 问题内容: 为什么这段代码没有抛出?看一看: 我不知道! 问题答案: 您为什么不能自己检查一下并抛出异常(如果您要的话)。

  • 我不知道为什么这个正则表达式不匹配。也许你能发现错误。 ficontents: 我想匹配>>>>>>客户端9462<<<<<捕获该号码,以及此后的所有内容,直到另一个客户端号码。所以我的第一个捕获是“9462”,第二个捕获是“Had a program exception;please check the error log”。 它使用JavaScript设置在regex101.com中工作得很好

  • 问题内容: 有谁知道为什么下面不等于0? 要么: 当我将其输入python时,它的值为1.22e-16。 问题答案: 该数字不能完全表示为浮点数。所以,不给你,它给你。 而其实类似。 那么,您如何处理呢? 您必须计算出或至少猜测出适当的绝对和/或相对误差范围,然后编写而不是: (这也意味着你要组织你的计算,使相对误差相对较大,而不是在你的情况,因为是恒定的,这是微不足道的,只是做了落后的。) Nu

  • 问题内容: The Go Playground上可用的程序读取 并产生一个错误 我了解是字符串的“零值”。我不明白为什么我不能分配给我的。 问题答案: 简单的答案是, 在语言规范中未将其定义为类型的有效值。 …但是也许您想要更长的答案? 是指针,接口,通道,切片,映射和函数类型的零值,它表示 未初始化的 状态。 考虑以下变量声明: 所有这些变量都有一个代表未初始化状态的值,这很自然。已被声明为指针