2016-11-04 7 views
0

私はこの問題をWiktorStribiżewの提案で解決しました。Pythonの正規表現のドット文字

編集済み:リストの最初の要素を一度に抽出する必要があります。その番号に対して他の操作を行う必要があるためです。私はテストのためだけに自分のコードにループを使用します。

算術式を数値のリストに分割したいと考えています。例えば

:1 + 0.2〜(3^4)* 5 - > [ '1'、 '0.2'、 '3'、 '4'、 '5']

私は再ライブラリを使用Pythonでは、式はドット文字 '。'で分割されています私は 'を含んでいませんが。デリミタで。

入力は、1 + 0.2である場合すなわち、出力がされる[1 'を '0'、 '2']、しなければならない[ '1'、 '0.2']

コードされます下記:

#!/bin/python 
import re 

delims = re.compile(r"[+-/*///^)]") 

while True: 
    string = input() 
    res = list() 
    i = 0 
    while i < len(string): 
     if string[i] >= '0' and string[i] <= '9': 
      num_str = delims.split(string[i:], 1)[0] 
      res.append(num_str) 
      i += len(num_str) - 1 
     i += 1 
    print(res) 

この質問に対するご意見は本当にありがとうございます。

+1

'--'で範囲を作成したり、エスケープしたり、charクラスの最後/先頭に移動したりするには、' [ - +/* ^)] ' –

+0

[Here](http://stackoverflow.com/questions)/32324595/regex-to-catch-special-characters/32324646#32324646のエラー)も同様の質問です。 –

+0

ありがとう!あなたは華麗です! –

答えて

0

あなたのアプローチがうまくいかない理由は、ドットを含む+-/の文字範囲を作成することです。私はまたあなたがものを過度に複製していると思う。

import re 
str = '1+0.2-(3^4)*5' 
res = re.split(r'[-+()/*^]+', str) 
print(res) 

出力['1', '0.2', '3', '4', '5']

は、このアプローチが正しく負の数を処理しませんのでご了承くださいます。

+0

負の数についての通知をありがとう! –

0

使用re.findall機能では、次のアプローチ:

num_str = '1+0.2-(3^4)*5' 
numbers = re.findall(r'\d(?=[^.]|$)|\d+\.\d+', num_str) 

print(numbers) 

出力:あなたが唯一の正の整数のみを抽出したい場合は

['1', '0.2', '3', '4', '5'] 
0

、以下を試してみてください。

[int(s) for s in str.split() if s.isdigit()] 

これは3つの理由正規表現の例よりも優れている: あなたが解析する必要がないので、それをより読みだ 、別のモジュールを必要としないアイブ氏はsimbolsと数字の間にスペースだったと仮定しました正規表現のミニ言語と より速いです。

+0

これで十分だと思いますか? –

+0

正と負の数字を区別したくない場合は、うまくいきます。私は、この1ライナーのソリューションは、正規表現を使用して、ホイールを再発明する方が良いと思います。 –

+1

文字列中の数字と記号がスペース '' 'で区切られていないとしても? –