Python 用于匹配名称并后跟可选空格的Regexp,但忽略注释

Python 用于匹配名称并后跟可选空格的Regexp,但忽略注释,python,regex,Python,Regex,我有一个文件,其中主要包含映射到特定数字列表的名称。我想解析这个文件,我认为正则表达式在这里会很好。不过,我有两个问题: 名称可以由一个单词组成,也可以由一个单词后跟多个单词组成,或者由一个带下划线的单词组成。单词还可以包含以下字符:(/->) 在文件的开头和其他一些不应包含在结果中的地方都有注释。注释始终是一行--,后面是一些文本,后面是另一行-- 所以如果我有以下文件 ----------------------------------- Comment ----------------

我有一个文件,其中主要包含映射到特定数字列表的名称。我想解析这个文件,我认为正则表达式在这里会很好。不过,我有两个问题:

  • 名称可以由一个单词组成,也可以由一个单词后跟多个单词组成,或者由一个带下划线的单词组成。单词还可以包含以下字符:
    (/->)

  • 在文件的开头和其他一些不应包含在结果中的地方都有注释。注释始终是一行
    --
    ,后面是一些文本,后面是另一行
    --

所以如果我有以下文件

-----------------------------------
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]}
如果一个问题问得太多,我会很高兴知道regexp


我正在使用Python 2.7。

这可能会满足您的要求:

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]}

这可能会满足您的需求:

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]}
荒谬的一行:

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

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

你的评论定界似乎模棱两可,你怎么知道第二条评论是评论而不是要解析的东西呢?@shenshei:这是个好问题,我猜一条可解析的行的末尾至少会有一个数字@steabert:我是regexp的新手,到目前为止,我所尝试的只是匹配没有特殊字符的可解析行,例如沿着
[a-zA-Z][a-zA-Z]*([a-zA-Z]*)?
(一个单词后面可以有更多的单词。@pg robban问题是如果有人想注释一个可解析的行,你怎么知道它是不是一个注释?否则你可以用
^(.*)(?:\s+\d++)$
解析该行,然后用
[int(i)for i in re.split(r'\s+',res[1])如果i]
要获取INT列表,输入是由另一个程序生成的,因此我认为我们可以假设,一旦一行是注释,它就一直是注释,对于可解析的行也是如此。您的注释定界似乎模棱两可,您如何知道第二条注释是注释而不是要解析的内容?@shenshei:这是一个好问题,我猜是这样的一个可解析的行的末尾总是至少有一个数字。@steabert:我是一个regexps新手,到目前为止,我所尝试的只是匹配没有特殊字符的可解析行,例如沿着
[a-zA-Z][a-zA-Z魟*([a-zA-Z魟*)?
(一个单词后面可以有更多的单词。@pg robban问题是如果有人想注释一个可解析的行,你怎么知道它是不是一个注释?否则你可以用
^(.*)(?:\s+\d++)$
解析该行,然后用
[int(i)for i in re.split(r'\s+',res[1])如果i]
要获得INT的列表,输入由另一个程序生成,因此我认为我们可以假设,一旦一行是注释,它就保持为注释,对于可分析的行也是如此。