2014-03-03 140 views
1

我想分割一些行,用字母和數字,但我不能拿出適當的正則表達式。不正確的python正則表達式

行的格式是一樣的東西單元=價值+單元,一些例子:

width = 3.45cm 
height = 2m 
width = 2mm 
height = 6.67m 

而且我想獲取每個名稱,值和單位單獨的輸出,這就是我完成:

line = infoData.readline() 
names = [] 
values = [] 
units = [] 
while line: 

    if "=" in line: 
     names.append(line[0:line.index("=")]) 
     m = re.search('\d+', line[line.index("="):len(line)]) 
     values.append(int(m.group())) 
     m = re.search('\D+[^=\n\.]', line[line.index("="):len(line)]) 
     units.append(m.group()) 
     line = infoData.readline() 

    else: 
     line = infoData.readline() 

是我得到期望的方式它的名字的唯一的事....

回答

2

你有點過分複雜。我會用:

data = [] 

for line in infoData: 
    if '=' not in line: 
     continue 
    name, value = line.split('=') 
    value, unit = re.search('([\d.]+)(\w+)', value).groups() 

    data.append({'name': name.strip(), 'value': float(value), 'unit': unit}) 

爲了您的樣本數據,讓您的字典與列表:

[{'name': 'width', 'unit': 'cm', 'value': 3.45}, 
{'name': 'height', 'unit': 'm', 'value': 2.0}, 
{'name': 'width', 'unit': 'mm', 'value': 2.0}, 
{'name': 'height', 'unit': 'm', 'value': 6.67}] 

,而不是3個獨立的名單。

+0

感謝Martijn,很好的簡短和良好的答案!!,這回答了我有關於如何做到這一點時,我有,例如67或當我有67.23的另一個問題。 – codeKiller

+0

@ user2919052:啊,是的,那是我的部分的一個錯誤,正則表達式只匹配整數。糾正。 –

+0

太棒了,用你的第一個表情我已經想出了類似的東西,但還是感謝! – codeKiller

2
data = ["width = 3.45cm","height = 2m","width = 2mm","height = 6.67m","nope"] 

import re 
pattern = re.compile("(\w+)\s*=\s*([\d.]+)\s*(\w+)") 
print [pattern.search(items).groups() for items in data if pattern.search(items)] 
# [('width', '3.45', 'cm'), ('height', '2', 'm'), ('width', '2', 'mm'), 
# ('height', '6.67', 'm')] 

正則表達式演示:

Regular expression visualization

Debuggex Demo

編輯:如果你正在尋找一種方式來獲得一本字典了一個正則表達式,可以是這樣做的

import re 
patt = re.compile("(?P<name>\w+)\s*=\s*(?P<value>[\d.]+)\s*(?P<unit>\w+)") 
print [patt.search(items).groupdict() for items in data if patt.search(items)] 

輸出

[{'name': 'width', 'unit': 'cm', 'value': '3.45'}, 
{'name': 'height', 'unit': 'm', 'value': '2'}, 
{'name': 'width', 'unit': 'mm', 'value': '2'}, 
{'name': 'height', 'unit': 'm', 'value': '6.67'}] 
+0

感謝一個不錯的RegEx解釋+例子Thefourtheye !! – codeKiller

+0

@ user2919052請檢查我的更新回答:) – thefourtheye

+0

檢查!!,再次感謝! – codeKiller