python 何时何地检测到空字符串并将其追加到由re.split(r'(\W*)',' ...words..')返回的列表中?

rsaldnfx  于 2022-12-25  发布在  Python
关注(0)|答案(1)|浏览(85)

代码:

import re

re_split_list = re.split(r'(\W*)', '...words...')
print(re_split_list, type(re_split_list), len(re_split_list))

实际产量:

['', '...', '', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', '', '', ''] <class 'list'> 17

根据@jonrsharpe提供的资源(https://regex101.com/r/m857F0/1 [1]),我期望得到以下输出。
预期输出:

['', '...', '', 'w', '', 'o', '', 'r', '', 'd', '', 's', '...', ''] <class 'list> 14

所以我更新的问题是,是什么功能导致索引3(元素4)、15和16处的空字符串被添加到python re. split返回的子字符串列表中?为什么在'...'和'w'之间有两个空字符串而不是一个空字符串(如在regex模拟器[https://regex101.com/r/m857F0/1][1]中所见)?为什么在第二个省略号'...'和输入字符串末尾匹配的空字符串之间有两个空字符串(也在regex模拟器中可见)?从方法调用到输出应用了什么规则?
链接:
[1]:https://regex101.com/r/m857F0/1
其他参考文献:
https://docs.python.org/3/library/re.html#functions

erhoui1w

erhoui1w1#

split调用在输入字符串"... words..."的以下位置匹配给定的正则表达式:

  • 索引0,匹配3个字符:"..."
  • 索引3,匹配0个字符:""
  • 索引4,匹配0个字符:""
  • 索引5,匹配0个字符:""
  • 索引6,匹配0个字符:""
  • 索引7,匹配0个字符:""
  • 索引8,匹配3个字符:"..."
  • 索引11,匹配0个字符:""

......总共8场比赛。
这是findall在相同参数下得到的8个匹配项:

re.findall(r'\.*', '...words...') == ['...', '', '', '', '', '', '...', '']

现在,在split版本中,这些匹配项是通过捕获组捕获的,因此它们会出现在结果列表中的奇数索引处。出现在匹配字符串 * 之间 * 的部分将在结果中的 * 偶数 * 索引处结束:
由于奇数索引有8个匹配项,因此结果列表中总共有8 * 2 + 1 = 17个元素,这有时会包括来自输入字符串中 * same * 位置的空字符串,但当这种情况发生时,它们位于 * empty * 分隔符的交替两侧(也在该位置)。

相关问题