2011-12-29 9 views
1

後に私は2つの番号で文字列のシリーズを持っている:Pythonの:スプリットフロートは第三小数点

1.782-100.799 
-18.107-102.016 
-17.504104.059 

私は、各文字列の最初の番号の第三小数点以下の私の文字列を分割する方法は?以下のように見えます:

1.782 -100.799 
-18.107 -102.016 
-17.504 104.059 

答えて

4

ヒューリスティックアプローチ正規表現使用:

>>> import re 
>>> s = """1.782-100.799 
... -18.107-102.016 
... -17.504104.059""" 
>>> re.findall('-?\d{1,3}(?:\.\d{3})*', s) 
['1.782', '-100.799', '-18.107', '-102.016', '-17.504', '104.059'] 

またはペアを取得するには、このライン・バイ・ラインを実行します。

>>> [re.findall('-?\d{1,3}(?:\.\d{3})*', ln) for ln in s.split("\n")] 
[['1.782', '-100.799'], ['-18.107', '-102.016'], ['-17.504', '104.059']] 
+0

とを、あなたは 'ジップ(結果を使用することができます[:: 2]、結果[ 1 :: 2]) 'を実行して、その結果セットを2タプルのリストに再圧縮します。 – AKX

+2

作品は完璧!ありがとう!! – Harpal

1

本当に基本的なアプローチ:

>>> data = """1.782-100.799 
... -18.107-102.016 
... -17.504104.059""" 

>>> [(x[:x.find('.') + 4], x[x.find('.') + 4:]) for x in data.splitlines()] 
[('1.782', '-100.799'), ('-18.107', '-102.016'), ('-17.504', '104.059')] 
3

結果は次のとおりです帽子は、正規表現を使用しない場合には、あなたがその望ましい見つける:各行が2つのだけの数字を持っていると仮定すると、その後、

s = '1.782-100.799\n-18.107-102.016\n-17.504104.059' 
result = [] 
for line in s.split('\n'): 
    i = line.index('.') + 4 
    result.append(line[:i] + ' ' + line[i:]) 

>>> print '\n'.join(result) 
1.782 -100.799 
-18.107 -102.016 
-17.504 104.059 
+0

これは非常に読みやすいです。 – Droogans

0
import re 

line = your_numbers_in_Strings_here 
result = re.findall('-?\d*\.\d{3}',line) 

newline = ' '.join(result) 

The meaning of the regular expression (re): 
? : preceding char zero or one time 
* : preceding char zero or infinite times 
\ : don't interprete the following char as an expression (escape) 
{n}: preceding char exactly n-times 
\d : decimal numbers 0-9 

so: 
'-?\d*\.\d{3}' 
'-?   ' = zero or 1 '-' 
' \d*\.  ' = zero or as many decimals before an '.' 
'  \d{3}' = exactly 3 decimals 
関連する問題