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的列表,输入由另一个程序生成,因此我认为我们可以假设,一旦一行是注释,它就保持为注释,对于可分析的行也是如此。