2012-02-08 28 views
1

我有一个文件,其中主要包含映射到特定数字列表的名称。我想分析这个文件,并且我认为正则表达式在这里会很好。我不过有两个问题:正则表达式匹配名称后跟可选空格,但忽略注释

  • 的名称可以由任何一个字或词,然后更多的单词,或者用下划线词的。一个词还可以包含以下字符:(/->)

  • 在文件的开头和其他一些不应包含在结果中的地方有一条评论。这些评论总是---其次是一些文本行,后跟的---

所以另一条线,如果我有以下文件

----------------------------------- 
Comment 
----------------------------------- 
Ignore these lines 
----------------------------------- 
someVar      0.0 1.0 
some var with spaces   52 93 
another var_with_underscores 3 
some var with (special->chars) 13 37 95 
another char/slash    132 
----------------------------------- 
Another comment 
----------------------------------- 
yet another var    27.3 9 

我想回到字典

{"someVar": [0.0, 1.0], 
"some var with spaces": [52, 93], 
"another var_with_underscores": [3], 
"another char/slash": [132] 
"some var with (special->chars)": [13, 37, 95], 
"yet another var": [27.3, 9]} 

如果问一个问题太多了,我会很高兴知道正则表达式。

我正在使用Python 2.7。

+3

您的评论划界似乎很模糊,你如何知道第二个评论是评论而不是解析的东西? – shenshei 2012-02-08 09:58:31

+0

你试过了什么正则表达式? – steabert 2012-02-08 10:07:23

+0

@shenshei:这是一个很好的问题,我的猜测是一个可解析的行将始终至少有一个数字。@steabert:我是一个正则表达式的新手,我试过的东西到目前为止只匹配没有特殊字符的可解析行,沿着'[a-zA-Z] [a-zA-Z _]行行([a-zA-Z _] *)?'(一个单词可选地跟着更多单词 – 2012-02-08 10:20:16

回答

3

这可能就是你所要寻找的:

import re 

results = {} 
with open('example.txt', 'r') as f: 
    for line in f.readlines(): 
     m = re.match(r'([^\d]+)(.*)', line.strip()) 
     if m and m.group(2): 
      results[m.group(1).strip()] = [float(n) for n in m.group(2).split()] 

哪个对你更新例如给:

{'some var with (special->chars)': [13.0, 37.0, 95.0] 
'another var_with_underscores': [3.0] 
'some var with spaces': [52.0, 93.0] 
'someVar': [0.0, 1.0] 
'another char/slash': [132.0] 
'yet another var': [27.3, 9.0]} 
1

荒谬的一行:

dict((m.group(1),map(float,m.group(2).split())) for m in re.finditer('^(.*?)\s*([ \d\.]+)$',whole_thing,re.M))