2012-05-11 6 views
1

さまざまな書式設定が可能なデータ文字列があります。通常、文字列のデータはスペースで区切られますが、それは必ずしもそうではないので、単純な.split(' ')はこの例では機能しません。複数のセパレータで文字列を区切り、1文字のみを抽出する

例文字列は次のとおりです。

string = '2012 05 06 04:20:00.0500 FOOBAR 4.7E+10 -55 33.0 555~2767 B 12 \r\n' 

、指数を含有することができる、私は必要なすべての番号を取得して起動するには - 私は使用することができ、それらを分離するスペースを持っている、+、または〜、かどうか:

re.findall(r'[~+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?', string) 
# giving the result; 
['2012', '05', '06', '04', '20', '00.0500', '4.7E+10', '-55', '33.0', '555', '~2767', '12'] 

また、文字列の1文字(この場合はB)が必要です。この単一の文字がB、F、またはOのいずれかになりますと、私はこれを取得して使用することによって、私の文字列にFOOBARを避けることができます。

re.findall(r'((?:(?:\b))[FBO]\b)', string) 
# giving the result: 
['B'] 

しかし、私に必要なのは二つの結果上記の組み合わせの結果を得ることです。私はいつもリストに2番目の結果を追加することができますが、元の文字列にある順番に表示するように、対応するリスト内の結果の位置が本当に好きですstring。つまり、次のようなリストが必要です:

['2012', '05', '06', '04', '20', '00.0500', '4.7E+10', '-55', '33.0', '555', '~2767', 'B', '12'] 

アイデアはありますか?それとも良い方法がありますか?

+2

この例の場合でも、変数名として 'str'を使用しないでください。組み込みの['str'](http://docs.python.org/library/functions.html#str)をシャドーイングして呼び出すことはできません。 – jamylak

+1

この例のために私の文字列を命名する判断が間に合わなかった...他の人が私を暗闇の片道通りに追いかけることを望んで、文字列に変更しました。 – BFTM

答えて

3

方法について:

re.findall(r'([~+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?|(?:(?:\b))[FBO]\b)', str) 

これが返されます。

['2012', '05', '06', '04', '20', '00.0500', '4.7E+10', '-55', '33.0', '555', '~2767', 'B', '12'] 

をまた、ガミガミするのではなく、変数名とPythonのタイプstrを上書きすることが第二のために身震いさせません。

+0

その正規表現は私にPerlを思い出させます。 ;) –

関連する問題