2017-02-28 6 views
0

HP製品の説明から製品ラインと製品モデルの情報を除外しようとしています。正規表現による製品モデルのフィルタリング(Python)

例:

HP EliteDesk 800 G1 SFF (H3S08US#ABA) 
HP Pro 3400 Series MT (H3S08US#ABA) 
HP EliteBook 8460p (H3S08US#ABA) 

予想される出力:

Production line: EliteDesk 
Production model: 800 G1 

Production line: Pro 
Production model: 3400 Series 

Production line: EliteBook 
Production model: 8460p 

ここでは、私が今のところ持っているものです。

product_line = re.search('([a-zA-Z]+) ([a-zA-Z]*\d+[a-zA-Z]*)', model).group(1) 
product_model = re.search('([a-zA-Z]+) ([a-zA-Z]*\d+[a-zA-Z]*)', model).group(2) 

ただし、出力結果は最初の例と2番目の例で800,3400になります。

これらの情報を除外する方法はありますか?正規表現を使用した高度な

+0

この行は常に正確に1語ですか? –

答えて

0

にそんなにすべてのあなたに感謝し、あなただけ使用することができ

を分割:

"HP (\w+) (.*?) \((.*)\)" 

ここRegex101.comにexampleです。

import re 

text="""HP EliteDesk 800 G1 SFF (H3S08US#ABA) 
HP Pro 3400 Series MT (H3S08US#ABA) 
HP EliteBook 8460p (H3S08US#ABA)""" 

pattern = re.compile("HP (\w+) (.*?) \((.*)\)") 


for line, model, serial in re.findall(pattern, text): 
    print "Production line : %s" % line 
    print "Production model : %s" % ' '.join(model.split(' ')[:2]) # Only the first two words 
    print "Serial number : %s" % serial 
    print 

これは、出力:

Production line : EliteDesk 
Production model : 800 G1 
Serial number : H3S08US#ABA 

Production line : Pro 
Production model : 3400 Series 
Serial number : H3S08US#ABA 

Production line : EliteBook 
Production model : 8460p 
Serial number : H3S08US#ABA 

ちょうどあなたが唯一の正規表現ソリューションたい場合は、正規表現

とは、あなたが使用できます。

pattern = re.compile("HP ([a-z]+) (\d+[a-z]?(?: \w+)?) .*?\((.*)\)", re.IGNORECASE) 

だけで分割

text="""HP EliteDesk 800 G1 SFF (H3S08US#ABA) 
HP Pro 3400 Series MT (H3S08US#ABA) 
HP EliteBook 8460p (H3S08US#ABA)""" 

for line in text.split("\n"): 
    words = line.split() 
    hp, hp_line = words[:2] 
    hp_model = ''.join(words[2:-1][:2]) 
    serial = words[-1] 
    print "Production line : %s" % hp_line 
    print "Production model : %s" % hp_model 
    print "Serial number : %s" % serial 
    print 
+0

ありがとうございます。私はその問題を過ちしていた。 –