python中re.split的输出对我没有意义

时间:2016-07-04 13:14:54

标签: python

print (re.split(r'[a-fA-F]','finqwenlaskdjriewasFSDFddsafsafasa',re.I|re.M))
print (re.split(r'[a-fA-Z]','finqwenlaskdjriewasFSDFddsafsafasa',re.I|re.M))
print (re.split(r'\d*','sdfsfdsfds123212fdsf2'))
print (re.split(r'\d','sdfsfdsfds123212fdsf2'))
print (re.split(r'\w+','dsfsf sdfdsf sdfsdf sfsfd'))

['', 'inqw', 'nl', 'sk', 'jri', 'w', 's', 'S', '', '', 'dsafsafasa']
['', 'inqw', 'nl', 'sk', 'jri', 'w', 's', '', '', '', 'ddsafsafasa']
['sdfsfdsfds', 'fdsf', '']
['sdfsfdsfds', '', '', '', '', '', 'fdsf', '']
['', ' ', ' ', ' ', '']

我认为这里的输出真的很奇怪。拆分字符串的模式转为'''有时在输出列表中,但在其他时间消失。

3 个答案:

答案 0 :(得分:3)

  

分割字符串的模式有时在输出列表中转为'',但在其他时间消失。

不,那里的输出中包含从不的模式(或匹配的模式)。那些''是匹配之间的。因为那是re.split的作用。你的例子:

>>> re.split(r'\d','sdfsfdsfds123212fdsf2')
['sdfsfdsfds', '', '', '', '', '', 'fdsf', '']

您按数字拆分,子串'123212'有六位数,因此它们之间有五个空字符串。这就是为什么输出中有五个空字符串的原因。

答案 1 :(得分:1)

首先,您实际上是在提供 maxsplit=10 参数,而不是flags=re.I|re.

其次,分隔符变成'';而是分隔符之间的字符串

>>> re.split(r':', 'foo:bar::baz:')
['foo', 'bar', '', 'baz', '']

注意2个分隔符之间的'',最后也是。

除非您的正则表达式包含捕获组((...)),否则结果中的分隔符本身不是

>>> re.split(r'(:)', 'foo:bar::baz:')
['foo', ':', 'bar', ':', '', ':', 'baz', ':', '']

第三:即使r'\d*'通常在字符串的开头匹配,字符串结尾,在每个字符之间,当前仅非零re.split考虑了长度匹配,因此该模式的行为类似于 r\d+ 。但是,此类行为可能会在Python 3.6及更高版本中发生更改,并在Python 3.5上发出警告FutureWarning: split() requires a non-empty pattern match.

答案 2 :(得分:0)

输出并不奇怪,这是有意的。 From the docs

  

如果分隔符中有捕获组并且它在字符串的开头匹配,则结果将以空字符串开头。对于字符串的结尾也是如此:

>>> re.split('(\W+)', '...words, words...')
['', '...', 'words', ', ', 'words', '...', '']
  

这样,分隔符组件总是在结果列表中的相同相对索引处找到。

强调增加指出为什么这样做。这同样适用于"空"字符串内部的序列和非捕获分隔符。基本上,在分隔符之前和之后都有内容 - 即使未捕获分隔符且内容为空。类似的方法str.split actually does the same

如果您知道分隔符,则可以始终重建初始字符串。捕获分离器并连接或在分离时插入分离器是等效的。 ''.join(re.split('(%s)' % sep, ':::words::words:::')) == sep.join(re.split('%s' % sep, ':::words::words:::'))