2012-01-19 6 views
26

、1は通常、パラメータを指定せずに、文字列のsplit方法を使用しています。のPython:Pythonでスペースで文字列を分割するには、すべてのスペース文字によって分割列

​​

しかし、昨日のように単語の間ZERO WIDTH SPACEを使用した文字列全体に走りましたよく(JavaScriptの人々の間で)短いblack magicパフォーマンスに私の新しい知識を変わって、私はsplitが十分でないため、すべてのwhitespace charactersによって、より良い分割する方法をお願いしたいと思います:

>>> u'a\u200bc d'.split() 
[u'a\u200bc', u'd'] 

UPD1

sthで提案されている解決策は、一般的には動作しますが、いくつかのOS設定やPythonコンパイルオプションに依存しています。確かな理由を知っているといいでしょう(Windowsで設定を有効にすることができれば)。

UPD2 cptphilは、すべてが明確にその偉大linkを見つけました:

だから私は問題についてUnicodeの技術委員会に連絡し、速やかに戻って応答を受信した受信しました。

がにZsのからU + 200Bゼロ幅スペースを変更する:彼らはZWSPが空白とみなさワンス・アポン・ア・タイム、だったが、それはunicode siteからのUnicode 4.0.1

引用に変更されたことを指摘しましたCf(2003.10.27)

U + 200B Zero Width Space(ZWSP)の使用に関する永続的な問題がありました。この文字の機能は、通常は許可されない位置での改行を許可することであり、したがって、機能的には一般カテゴリがCfの書式文字です。この動作は、Unicode標準でよく記述されており、Unicode文字データベースでは空白文字とはみなされません。しかし、歴史的な理由から、一般的なカテゴリは依然としてZs(Space Separator)であり、キャラクターが誤用される。 ZWSPは空白ではない唯一のZs文字です。一般カテゴリは、ルールの誤解を引き起こす可能性があります。D13ベース文字は、マークを結合するためのベースとしてZWSPを許可します。

U + 200Bの一般カテゴリをZsからCfに変更することを提案します。

解像度:クローズ。 Unicodeバージョン4.0.1では、U + 200Bの一般カテゴリはZsからCfに変更されます。

変更がPythonに反映されました。 Python 2.5.4および2.6.5のu'\u200B'.isspace()の結果はTrueであり、Python 2.7.1ではすでにFalseです。他の空白文字については

定期splitは十分です:

>>> u'a\u200Ac'.split() 
[u'a', u'c'] 

そして、それはあなたのために十分でない場合、Gabi Purcaruは以下のとおり文字を一つずつ追加します。

あなたは「再」モジュールを使用すると「スプリット」に区切りを渡すことができ
+1

'u'a \ u200bc D'.split()' 'を返します[u'a 'u'c' を、u'd」 ] '。これは、UbuntuでPython 2.6.5を使用しています。 – NPE

+1

@aix: '[u'a \ u200bc、u'd ']'を返します(Arch LinuxではPython 2.7.2)。米国のロケール。 –

+0

@aix、hmm、面白い! – newtover

答えて

17

編集

\ u200bは技術的に空白として定義されていないことが判明しています。したがって、Pythonはunicodeフラグがオンの場合でも\ sと一致すると認識しません。したがって、空白以外の文字として扱われなければなりません。

http://en.wikipedia.org/wiki/Whitespace_character#Unicode

http://bugs.python.org/issue13391

import re 

re.split(ur"[\u200b\s]+", "some string", flags=re.UNICODE) 
+0

リンクのおかげで – newtover

+0

ここに '\ s'が書かれていますhttps://docs.python.org/2/howto/regex.html –

2
+0

そのようにして、それらのグループではありません – newtover

+0

これは、可能なすべての空白文字のリストではなく、* 1つの*区切り文字列しか指定できないため、OPには役立ちません。 'split()'と 'sep'引数は、引数なしの場合と全く違った動作をします。詳しくはリンクを参照してください。 –

+0

申し訳ありませんが、私は 're'の代わりに 'str' docリンクを貼り付けました - 固定;) –

6

あなたが有効になってUnicodeのマッチングに正規表現を使用することができます。

>>> re.split(r'(?u)\s', u'a\u200bc d') 
[u'a', u'c', u'd'] 
+1

あなた(そして@aix)には私の持っていない設定があります!つまり、Windows 7では動作しません。 – newtover

+0

近くのFreeBSDで動作しますが! – newtover

4

あなたが好き、re.splitを使用することができますこの:

import re 
re.split(u'\s|\u200b', your_string) 
+0

私はそれらのすべてを=( – newtover

+0

)の名​​前にしたいとは思いません。@ sth'sに行くのが一番良い方法ですが、それがうまくいかない場合は、それらの名前をすべて付ける必要があります(もちろん、なぜそれらのソリューションが機能していないのか) –

2

あなたはこのようなものを使用することはできますか?

re.split(r'\s+', your_string, re.UNICODE) 
2

だけ使用split:私のマシン上で

>>> u'\u200b'.isspace() 
True 
+0

質問のテキストは、必ずしもうまくいきません。 – newtover

+0

+1は 'isspace'メソッドについて知っています=) – newtover

関連する問題