2012-03-22 6 views
3
>>> ".a string".split('.') 
['', 'a string'] 

>>> "a .string".split('.') 
['a ', 'string'] 

>>> "a string.".split('.') 
['a string', ''] 

>>> "a ... string".split('.') 
['a ', '', '', ' string'] 

>>> "a ..string".split('.') 
['a ', '', 'string'] 

>>> 'this is a test'.split(' ') 
['this', '', 'is', 'a', 'test'] 

>>> 'this is a test'.split() 
['this', 'is', 'a', 'test'] 

なぜがsplit(' ')と異なるのは、呼び出された文字列の空白が空白文字の場合のみですか?はpython str.split()と矛盾していますか?

なぜsplit('.')が分割されますか"..."['','']split()

ドキュメントはこの(@agf下記参照)について明確にしている... 2枚のセパレータ間に空の単語を考慮していないが、私は、この選択した動作である理由を知りたいのです。

私は、ソースコード(here)で見て、ライン136は、よりだけ小さくなければならないと思っていますstr.split docsを見るi < str_len ...

答えて

12

、この行動が具体的に言及されています

sepが指定された場合、連続する区切り文字はグループ化されず、 は空の文字列を区切ります(たとえば、'1,,2'.split(',')['1', '', '2']を返します)。 sep引数は複数の 文字で構成できます(たとえば、'1<>2<>3'.split('<>')['1', '2', '3']を返します)。空の文字列を指定された区切り文字で分割すると、 ['']が返されます。

sepは異なる分割アルゴリズムが 適用される指定又はNoneある、されていない場合は、次の連続する空白のランが単一 セパレータとみなされ、その結果が開始 に空の文字列を含まない場合、または終了します文字列の先頭または末尾に空白があります。したがって、 空の文字列または空白だけで構成される文字列を で区切ってNoneという文字列に分割すると、[]が返されます。

Pythonは期待していることを実行しようとします。あまりにもハード考えていないほとんどの人は、おそらく

'1 2 3 4 '.split() 

['1', '2', '3', '4'] 

を返すことを期待するスペースは固定幅の列を作成するタブの代わりに使用されている分割データについて考えてみよう - データが異なる場合各行には異なる数のスペースがあります。

行の最後には見えない空白が多くあり、デフォルトではそれも無視され、視覚的に期待される答えが得られます。それは区切り文字が指定されているときに使用されるアルゴリズムに来るとき

、CSVファイル内の行を考える:

1,,3 

が第一と第三列のデータ、及びどれが第二であることを意味し、あなたはそうあなたは、Tすることができません

'1,,3'.split(',') 

['1', '', '3'] 

を返すようにしたいでしょう各列がどの列から来たのかを告げてください。

+0

はい。私はそれを見て、質問に追加します。あなたはなぜこれが選ばれた行動であるか知っていますか?この動作の一部のアプリケーション/ケース? – ijverig

+1

@ijverig私は答えに論理的根拠を付けました。 – agf

+0

私はあなたに同意します。私が興味をそそられるのは、セパレータが指定されたときです。 'split( 'sep')'は、 "人々が期待する"ことをしません。連続する区切り文字の間に空の文字列を戻すことも、私にとって非常に奇妙です。私はこれがいくつかの一般的な特定の状況で使用されているかどうかを知りたいと思います。とにかくおかげさまで、あなたはとても役に立ちました! – ijverig

関連する問題