2016-04-17 11 views
1

現在、QtでPython split()関数(引数なしのデフォルトバージョン)の動作を正確に再現しようとしています。QtのPython string.split()関数の動作を複製する

私はので、私は次のように使用してみました、デフォルトの区切り文字はCR/LF/TAB記号の任意の数であると言われています

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

しかし、これは正確にその動作を複製しません。

これを約4メガバイト分のテキストで実行し、一意の単語の数を数えれば133293になります。しかし、私がPython関数を使って同じ結果を出した場合、結果は133367になります。間違い。

これを修正する方法についてのご意見は大歓迎です。

答えて

0

私の推測では、Pythonはではありません。は空の文字列をスキップしていて、その違いを考慮しています。関数がPythonの機能を模倣するようにするには、空文字列を含めるか、実装した動作を取得する場合は、Pythonでs_body.split()と書くことができます。空白でない文字の間のすべての空白を取り除きます。つまり、空の文字列を返しません。

+0

あなたが言ったようにして空の部分を保持しようとしました。しかし、これはうまくいかなかった。また、区切り文字として[\ v \ f \ r \ t \ n] +を試しました。これはまだ私がこれでテストしたファイルの大部分について正確な結果を得ていませんでした(しかし、正規表現ではそれが正しくなったファイルの割合はわずかに増加しました)。 – user129186

0

すべてのUnicodeの空白文字Unicode文字列、Pythonのsplit()は、ごく自然に、のセットに分割されますと、だけでなく、微弱な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___________________' 

だから、ほとんどが、しかし、いくつかのQt4をで空白としてrecognzedされていないU+0085 NEL (Next Line)理由で - それは簡単に改善だが:

>>> r = qs.split(QRegExp('[\\s\x85]+'), QString.SkipEmptyParts) 
>>> r.count() 
25 
>>> str(r.join('')) 
'_________________________' 
関連する問題