我目前正在尝试在Qt中准确地复制Python split()函数(默认版本,没有任何参数)的行为。
有人告诉我,默认分隔符是任意数量的CR/LF/TAB符号,因此我尝试使用以下分隔符:
s_body.split(QRegExp("[\r\n\t ]+"), QString::SkipEmptyParts);
然而,这并不能精确地复制它的行为。
如果我在大约4兆字节的文本上运行它,并计算唯一单词的数量,我得到133293。但是,如果我使用Python函数执行相同的操作,结果将变为133367 -因此仍然存在问题。
任何关于如何解决这个问题的反馈都将非常受欢迎。
发布于 2016-04-17 11:56:04
我的猜测是Python不会跳过空字符串,它们会考虑到差异。如果您希望您的函数模仿Python的功能,您可以选择包含空字符串,或者如果您希望获得所实现的行为,您可以在Python中编写s_body.split()
;如果没有参数,它将去掉非空格字符之间的所有空格,这意味着您不会得到任何空字符串。
发布于 2016-04-18 04:59:00
使用unicode字符串,python的split()
将很自然地拆分到所有unicode空格字符集,而不仅仅是弱小的ascii集:
>>> s = '\t_\n_\x0b_\x0c_\r_ _\x85_\xa0_\u1680_\u2000_\u2001_\u2002_\u2003_\u2004_\u2005_\u2006_\u2007_\u2008_\u2009_\u200a_\u2028_\u2029_\u202f_\u205f_\u3000_'
>>> len(s)
50
>>> len(s.split())
25
>>> ''.join(s.split())
'_________________________'
现在让我们看看Qt做了什么(使用PyQt4):
>>> qs = QString(s)
>>> r = qs.split(QRegExp('\\s+'), QString.SkipEmptyParts)
>>> r.count()
24
>>> str(r.join(''))
'______\x85___________________'
所以,差不多就是这样了,但是由于某些原因,U+0085 NEL (Next Line)
在Qt4中没有被识别为空格--但这很容易补救:
>>> r = qs.split(QRegExp('[\\s\x85]+'), QString.SkipEmptyParts)
>>> r.count()
25
>>> str(r.join(''))
'_________________________'
https://stackoverflow.com/questions/36672419
复制相似问题