在Qt中复制Python string.split()函数的行为

时间:2016-04-17 03:40:10

标签: python regex string qt split

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

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

s_body.split(QRegExp("[\r\n\t ]+"), QString::SkipEmptyParts);

然而,这并没有准确地复制其行为。

如果我在大约4兆字节的文本上运行它,并计算唯一字的数量,我得到133293.但是,如果我使用Python函数执行相同操作,结果将变为133367 - 因此仍然存在一些问题

任何有关如何解决此问题的反馈都将非常受欢迎。

2 个答案:

答案 0 :(得分:0)

我的猜测是Python 跳过空字符串,而且它们正在考虑差异。如果你希望你的函数模仿Python的功能,你可以选择包含空字符串,或者如果你想获得你已经实现的行为,你可以在Python中编写s_body.split();没有参数,它会删除非空白字符之间的所有空格,这意味着你不会返回空字符串。

答案 1 :(得分:0)

使用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(''))
'_________________________'