问题描述
我正在尝试写一个模式来制作像这样的字典:
from tkinter import *
from time import sleep
from PIL import ImageTk,Image
class Question:
def __init__(self,question,answers,correctLetter):
self.question = question
self.answers = answers
self.correctLetter = correctLetter
def check(self,letter,view):
global right
if(letter == self.correctLetter):
label2= Label(view,text="Right!")
right += 1
else:
label2= Label(view,text="Wrong!")
label2.pack()
view.after(1000,lambda *args: self.unpackView(view))
def getView(self,window):
view = Frame(window)
label1 = Label(view,text=self.question)
button_a = Button(view,text=self.answers[0],command=lambda *args: self.check("A",view))
button_b = Button(view,text=self.answers[1],command=lambda *args: self.check("B",view))
button_c = Button(view,text=self.answers[2],command=lambda *args: self.check("C",view))
button_d = Button(view,text=self.answers[3],command=lambda *args: self.check("D",view))
label1.pack()
button_a.pack()
button_b.pack()
button_c.pack()
button_d.pack()
return view
def unpackView(self,view):
view.pack_forget()
askQuestion()
def askQuestion():
global questions,window,index,button,right,number_of_questions
if(len(questions) == index + 1):
Label(window,text="Thank you for answering the questions. " + str(right) + " of " + str(number_of_questions) + " questions answered right").pack()
return
button.pack_forget()
index += 1
questions[index].getView(window).pack()
questions = []
file = open('C:\\Users\\tjohn\\Desktop\\Art Intergration\\Comp\\questions.txt',"r")
line = file.readline()
while(line != ""):
questionString = line
answers = []
for i in range (4):
answers.append(file.readline())
correctLetter = file.readline()
correctLetter = correctLetter[:-1]
questions.append(Question(questionString,correctLetter))
line = file.readline()
file.close()
index = -1
right = 0
number_of_questions = len(questions)
window = Tk()
C = Canvas(window,bg="blue",height=350,width=800)
C.pack()
img = ImageTk.PhotoImage(Image.open("C:\\Users\\tjohn\\Desktop\\quiz.png"))
C.create_image(800/2,350/2,anchor=CENTER,image=img)
button = Button(window,text="Start",command=askQuestion)
button.pack(anchor=CENTER)
window.mainloop()
外观如下:
string= '30.95.91.251 - larson8319 [21/Jun/2019:16:02:02 -0700] "PUT /one-to-one/whiteboard HTTP/1.0" 401 7270'
使用此代码:
dic= {"host":"30.95.91.251","user_name":"larson8319","time":"21/Jun/2019:16:02:02 -0700","request":"PUT /one-to-one/whiteboard HTTP/1.0"}
但是我无法使方括号消失并订购请求零件。
解决方法
更具体,并使用字符类([...]
):
(?P<host>[\d.]+)[-\s]+
(?P<user_name>\w+)\s+
\[(?P<time>[^][]+)\]\s+
"(?P<request>[^"]+)"
或者-完全使用解析器:
from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
string = '30.95.91.251 - larson8319 [21/Jun/2019:16:02:02 -0700] "PUT /one-to-one/whiteboard HTTP/1.0" 401 7270'
class LogVisitor(NodeVisitor):
grammar = Grammar(
r"""
entry = ip user time request rest
ip = ~"[\d.]+" junk
user = ~"\w+" junk
time = "[" ~"[^][]+" "]" junk
request = '"' ~"[^\"]+" '"'
junk = ~"[-\s]*"
rest = ~".*"
"""
)
def generic_visit(self,node,visited_children):
return visited_children or node
def visit_entry(self,visited_children):
ip,user,time,request,*_ = visited_children
return dict([ip,request])
def __clean__(self,visited_children,first=False):
if first:
_,what,*_ = visited_children
else:
what,*_ = visited_children
return what.text
def visit_ip(self,visited_children):
return ('ip',self.__clean__(node,visited_children))
def visit_user(self,visited_children):
return ('user',visited_children))
def visit_time(self,visited_children):
return ('time',True))
def visit_request(self,visited_children):
return ('request',True))
lv = LogVisitor()
result = lv.parse(string)
print(result)
哪个会产生
{'ip': '30.95.91.251','user': 'larson8319','time': '21/Jun/2019:16:02:02 -0700','request': 'PUT /one-to-one/whiteboard HTTP/1.0'}