微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

试图使用re.verbose制作字典

如何解决试图使用re.verbose制作字典

我正在尝试写一个模式来制作像这样的字典:

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>[^"]+)"

请参见a demo on regex101.com


或者-完全使用解析器:

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'}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。