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', '']
['', ' ', ' ', ' ', '']
我认为这里的输出真的很奇怪。拆分字符串的模式转为'''有时在输出列表中,但在其他时间消失。
答案 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:::'))