在Qt中复制Python字符串.split()函数的行为



我目前正试图在Qt中准确复制Python split()函数(默认版本,没有任何参数)的行为。

我被告知默认的分隔符是任何数量的CR/LF/TAB符号,因此我尝试使用以下内容:

s_body.split(QRegExp("[rnt ]+"), QString::SkipEmptyParts);

然而,这并不能准确地复制其行为。

如果我在大约4兆字节的文本上运行这个程序,并计算唯一单词的数量,我得到133293。然而,如果我使用Python函数进行同样的操作,结果将变为133367,因此仍然存在问题。

任何关于如何解决这个问题的反馈都将非常受欢迎。

我的猜测是Python不是跳过空字符串,它们是造成差异的原因。如果你想让你的函数模仿Python的功能,你可以选择包含空字符串,或者如果你想得到你已经实现的行为,你可以用Python编写s_body.split();在没有参数的情况下,它去除了非空白字符之间的所有空白,这意味着您不会返回空字符串。

使用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('[\sx85]+'), QString.SkipEmptyParts)
>>> r.count()
25
>>> str(r.join(''))
'_________________________'

最新更新