Python正则表达式拆分参数化文本文件

时间:2018-04-26 15:19:00

标签: python regex python-2.7

我正在尝试重复拆分包含'string = float'格式的文件。 下面是文件的样子。

+name1 = 32    name2= 4
+name3 = 2     name4 = 5
+name5 = 2e+23
...  

我希望他们把它写成字典。 喜欢......

a={name1:32, name2:4, name3:2, name4:5, name5:2e+23}

我是正规表达的新手,很难搞清楚要做什么。 经过一些谷歌搜索,我试着做如下删除“+”字符和空格..

p=re.compile('[^+\s]+')
splitted_list=p.findall(lineof_file)

但这给了我两个问题.. 1.当没有空间btw名称和“=”符号时,它不会激发。 2.对于像2e + 23这样的数字,它将两者之间的+号分开。

我设法在修改了depperm的代码之后解析了我想要的文件 但我面临另一个问题。 为了更好地解释我的问题。以下是我的文件的样子。 +符号后,多个参数和值对可以出现'='符号。 参数名称可以包含任何位置的字母和数字。值也可以包含+ - 带科学通知的符号(E / e- +)。有时,如果单引号,则值可以是数学表达式。

+ abc2dfg3  = -2.3534E-03    dfe4c3= 2.000
+ abcdefg= '1.00232e-1*x' * bdfd=1e-3

我设法使用以下正则表达式解析上面的内容。

re.findall("(\w+)\s*=\s*([+-]?[\d+.Ee+-]+|'[^']+')",eachline)

但是现在我的问题有时像“* bdfd = 1e-3”,可能会有一些评论。在我的文件中*(星号)之后的任何内容都应该被视为注释,但如果*存在于单引号字符串中则不会。 使用上面的正则表达式,它也解析“bdfd = 1e-3”但我希望它不被解析。 我试图找到解决方案几个小时,但到目前为止我找不到任何解决方案。

3 个答案:

答案 0 :(得分:1)

我建议只抓取名称和值,而不是担心空格或不需要的字符。我会使用这个正则表达式:(name\d+)\s?=\s?([\de+]+)来获取名称,然后你也可以将数字分组,即使它有一个e或空格。

import re
p=re.compile('(name\d+)\s*=\s*([\de+]+)')

a ={}
with open("file.txt", "r") as ins:
    for line in ins:
        splitted_list=p.findall(line)
        #splitted_list looks like: [('name1', '32'), ('name2', '4')]
        for group in splitted_list:
            a[group[0]]=group[1]
print(a)
#{'name1': '32', 'name2': '4', 'name3': '2', 'name4': '5', 'name5': '2e+23'}

答案 1 :(得分:1)

您可以将正则表达式与字符串拆分结合使用:

创建文件:

t =""" 

+name1 = 32    name2= 4
+name3 = 2     name4 = 5
+name5 = 2e+23"""

fn = "t.txt"
with open(fn,"w") as f:
    f.write(t)

拆分文件:

import re
d = {}
with open(fn,"r") as f:
    for line in f:    # proces each line
        g = re.findall(r'(\w+ ?= ?[^ ]*)',line)    # find all name = something
        for hit in g:                              # something != space
            hit = hit.strip()                      # remove spaces
            if hit:
                key, val = hit.split("=")          # split and strip and convert  
                d[key.rstrip()] = float(val.strip())   # put into dict
print d

输出:

{'name4': 5.0, 'name5': 2e+23, 'name2': 4.0, 'name3': 2.0, 'name1': 32.0}

答案 2 :(得分:1)

您不需要正则表达式来实现目标。您可以使用built-in Python方法。

your_dictionary = {}
# Read the file 
with open('file.txt','r') as fin:
  lines = fin.readlines()
# iterate over each line
for line in lines:
  splittedLine = line.split('=')
  your_dictionary.push({dict.push({
  key:   splittedLine[0],
  value: splittedLine[1]
});
print(your_dictionary)

希望它有所帮助!