2012-07-02 69 views
0

我是python和正则表达式的新手。我目前正在尝试制作一个程序,该程序读取下面的文件的内容,并获取部分内的特定参数和max_speeds。在每个SECTION:#,参数都缩进(TAB),直到下一节:#python正则表达式,错误结果

[SECTION:3] 
     paramter = 3 
     state = AZ 
     car = toyota 
     max_speed = 90.000 
     any_pets = yes 
[SECTION:13] 
     paramter = 10 
     state = NY 
     car = honda 
     max_speed = 120.000 
     any_pets = yes 
[SECTION:85] 
     paramter = 31 
     state = TX 
     car = kia 
     max_speed = 30.000 
     any_pets = no 

这是我的代码:

import re 
file = open('file.txt').readlines() 
file_str = str(file) 

for lines in file_str: 
    myreg = re.compile(r'(?<=SECTION:13).+(max_speed\s\=\s\w+)') 
    myreg1 = myreg.search(lines) 
    print myreg1.group(1) 

的问题是,结果总是错的..就好像正则表达式总是与最后一节的结果相匹配。

请让我知道我在做什么错,什么是最好的做法。谢谢!

+3

你可能有兴趣在Python [ConfigParser(http://docs.python.org/library/configparser.html#examples) – Levon

回答

3

您有许多问题。首先,阅读这样的文件行:

with open('file.txt') as f: 
    for line in f: 
     # process each line. 

你正在阅读行的样子,你创建一个列表与readlines,然后使其与str一个字符串,它会给你喜欢"['line1\n', 'line2\n']"数据。然后迭代该字符串将依次给你每个字符。

但是你可能根本不需要自己读取文件。内置模块ConfigParser将直接为您解析这些文件,请给它看看。

+0

嗨斯内德,非常感谢你的回答。我已经看了几个'ConfigParser'的例子,我有一种感觉,我会用这个来解决我的问题。不过,我想与大家分享如下: '开放的( 'file.txt的')为f:' \t'在F线:' \t \t'MYREG = re.compile(R'(< = SECTION:13)+(MAX_SPEED \ S \ = \ S \ W +)')' \t \t'myreg1 = myreg.search(线)' \t \t'打印myreg1.group(1)' 为什么myreg1不符合'SECTION:13'下的'max_speed'?有任何想法吗? – Squid

+0

如果你喜欢这个答案,接受它与大复选标记。 –

+0

鱿鱼:你正在逐一寻找线条,所以你不能指望和[[SECTION:13]'和'max_speed = ..'匹配,因为它们在不同的线上。你将永远不会有一个单一的字符串与他们两个。 –

0

你应该尝试一些这样的:(我没有运行和测试代码,使其运行自己)同时使用configparser模块用来,只是用以下

import re  
pattern = '(?<=SECTION:13).+(max_speed\s\=\s\w+)' 
mattches = re.findall(pattern, '\n'.join(open('file.txt').readlines())) 
print mattches 
+1

使用ConfigParser总是一个更好的选择! – pinkdawn

+0

''\ n'.join(open(..)。readlines())'?你有没有尝试过:'open(..)。read()'? –

+0

:P我只是复制他的代码,并且懒洋洋地添加'\ n'.join().. – pinkdawn

0

为了应付款项下缩进代码:

from ConfigParser import ConfigParser 

class fp(): 
    def __init__(self, filename): 
     self.fileobj = open(filename) 

    def readline(self): 
     return self.fileobj.readline().lstrip() 

f = fp('e:/file.txt') 
config = ConfigParser() 
config.readfp(f) 
print config.get('SECTION:3', 'state')