1

さまざまなフォーマットを持つことができるデータ文字列があるとします。名目上、文字列内のデータはスペースで区切られますが、常にそうであるとは限らないため.split(' ')、この場合、単純なデータは機能しません。

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

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つの結果を組み合わせた結果を取得することです。いつでも2番目の結果をリストに追加できますが、対応するリスト内の結果の位置を、元の文字列に存在する順序で表示したいと思いますstring。つまり、次のようなリストが必要です。

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

何か案は?それとももっと良い方法はありますか?

4

1 に答える 1

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']

Also, not to nag, but overwriting the Python type str with a variable name made be shudder for a second there.

于 2012-05-11T14:08:39.270 に答える