我是python和正则表达式的新手。我目前正在尝试创建一个程序来读取下面文件的内容,并在部分中获取特定参数和max_speeds。在每个SECTION:#下,参数都是缩进的(TAB),直到下一个SECTION:#
[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)
问题是结果总是错误的......好像正则表达式总是匹配最后一节的结果。
请让我知道我做错了什么,最好的做法是什么。谢谢!
答案 0 :(得分:3)
你有很多问题。首先,读取如下文件中的行:
with open('file.txt') as f:
for line in f:
# process each line.
您阅读行的方式是,您使用readlines
创建一个列表,然后将其设为str
的字符串,它会为您提供"['line1\n', 'line2\n']"
等数据。然后迭代该字符串将依次为您提供每个字符。
但是你可能根本不需要自己阅读文件。内置模块ConfigParser
将直接为您解析这些文件,看一下。
答案 1 :(得分:0)
你应该尝试这样的:(我没有运行并测试代码,让它自己运行)
import re
pattern = '(?<=SECTION:13).+(max_speed\s\=\s\w+)'
mattches = re.findall(pattern, '\n'.join(open('file.txt').readlines()))
print mattches
答案 2 :(得分:0)
要在使用ConfigParser模块时处理部分下的缩进,只需使用以下代码:
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')