2017-12-05 2 views
1

私はいくつかのデータを項目のリスト形式で読み込んでいます。各項目には、1つ以上の単語でもよい名前と、単一の整数または整数の一部でもよい量があります。アイテムのリストを分割するPython 3正規表現ですか?

Ex。

'12 Spruce Log 4/5 Water 3 Orange 3/18 Oak Plank' 

私は次のリストに、この分割をしたい:ここ

['12 Spruce Log', '4/5 Water', '3 Orange', '3/18 Oak Plank'] 

は私のPythonの正規表現です:

import re 
re.findall(r'\d+(/\d+)?\D+', "12 Spruce Log 4/5 Water 3 Orange 3/18 Oak Plank") 

これは明らかに適切ではない、次の結果、生成:

['', '/5', '', '/18'] 

彼はここで適切な正規表現ですか?

答えて

3

あなたはこれを試すことができます。

import re 
s = '12 Spruce Log 4/5 Water 3 Orange 3/18 Oak Plank' 
new_s = re.split('(?<=[a-zA-Z])\s(?=\d)', s) 

出力:ちょうどre.findallを使用して

['12 Spruce Log', '4/5 Water', '3 Orange', '3/18 Oak Plank'] 

または、:

new_list = [i[:-1] if i.endswith(' ') else i for i in re.findall('[\d\/]+\s[a-zA-Z\s]+(?=\d)|[\d\/]+\s[a-zA-Z\s]+(?=$)', s)] 

出力:

['12 Spruce Log', '4/5 Water', '3 Orange', '3/18 Oak Plank'] 
+0

、またはあなたがつもりはPython 3.7で失敗 – wim

+0

なぜ '(<= [-はZa - ? Z]) '? –

+0

@StefanPochmann '(?<= [a-zA-Z])'は、正規表現が常に項目の終わりと項目数量の開始前に分割されるようにする単なる方法です。 – Ajax1234

0

だからここに私が思い付いたものです:正規表現のための生の文字列を使用

/(?:\d+\/\d+|\d+)\s(?:[[:word:]]+\s*){1,2}(?=\d|$)/g 

demo on regex101.com

関連する問題