2014-03-03 101 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