为何re.split()返回的字符串列表中存在空字符串?
为什么re.split带捕获组时会出现空字符串?
先看你的代码和输出:
import re t = re.split(r'([!\s])', "Hello! How are you?") print(t) # 输出: ['Hello', '!', '', ' ', 'How', ' ', 'are', ' ', 'you?']
第三个空字符串的出现,本质是re.split的固有分割规则导致的,和是否能通过join还原原字符串无关,具体拆解这个过程:
- 正则
([!\s])会匹配!或者空白字符,且因为加了捕获组,匹配到的分隔符会被加入结果列表。 - 处理字符串
"Hello! How are you?"时,第一个匹配到的分隔符是!:!左边的内容Hello被加入列表;- 捕获到的
!本身被加入列表; !右边剩余的字符串是How are you?(注意开头带空格)。
- 接下来处理剩余字符串
How are you?,第一个匹配到的分隔符是开头的空格:- 这个空格左边没有任何字符,对应的片段就是空字符串
'',按照规则必须被加入列表; - 捕获到的空格
被加入列表; - 空格右边的
How再加入列表,后续以此类推。
- 这个空格左边没有任何字符,对应的片段就是空字符串
简单说:re.split用捕获组分隔时,会严格保留分隔符前后的所有片段——哪怕两个分隔符是连续的(比如这里的!和空格紧挨着),中间的空片段也会被保留,这是函数的统一逻辑,不会因为“去掉空串也能还原”就省略它。
比如换个例子,字符串是"!!Hi",用同样的正则split会得到['', '!', '', '!', 'Hi'],这里开头的空串也是因为第一个!在字符串最开头,左边没有内容,所以生成空片段。这种一致性的设计,能让你在任何场景下都能清晰看到分割的完整过程,不会出现“某些空片段被自动省略”的不确定情况。
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

