首页 > 解决方案 > Python中以下特定情况下正则表达式与字符串操作的性能比较

问题描述

我将从日志文件中提取数据并将这些数据写入 CSV 文件。

我搜索了一下,发现很多人试图使用正则表达式来解决这类问题。下面的代码是我写的来解决这个问题。

def processLine(line):
    dash_split = line.split('-')
    ip = dash_split[0].strip()
    client_id = (dash_split[1]).split('[')[0].strip()
    time_stamp = (line.split("["))[1].split("]")[0].strip()
    quoted = line.split('"')
    url = quoted[1].strip()
    response_code = quoted[2].split()[0].strip()
    user_agent = quoted[5].strip()
    print(ip, "\n", client_id, "\n", time_stamp, "\n", url, "\n", response_code, "\n", user_agent)

#sample logline to be processed

line = '206.92.168.224 - defcyfefydeecgqwfcecyqw [11/Jul/2016:00:17:07 -0700] "POST /token? HTTP/1.1" 200 89 "-" "Java/1.8.0_201"rt=0.047 uct="0.000" uht="0.047" urt="0.047"'

我可以知道在性能方面是否有任何正则表达式比上述字符串操作更好?

标签: regexpython-3.xstringsplit

解决方案


一个可能的正则表达式可能是:

pattern = "((?:\d+[.]){3}\d+)\s*-\s*(\w+)\s*\[([^\]]*)\]\s*\"([^\"]*)\"\s*(\d+)[^\"]*\"-\"\s*\"([^\"]*)\".*$"

这确实有点混乱,尤其是因为\". 但在我看来,对于对正则表达式稍有了解的人来说,这个表达式还是比所有的拆分都清晰...

每个括号(...)表示一个捕获组,您可以稍后从匹配中提取该捕获组,这将保存您的不同变量。你会得到它:

import re
def process_line(line):
    r = re.search(pattern, line)
    if r:
        ip, client_id, time_stamp, url, response_code, user_agent = r.groups()
    else:
        return "Error!"

并执行与您相同的打印,给出:

206.92.168.224 
defcyfefydeecgqwfcecyqw 
11/Jul/2016:00:17:07 -0700 
POST /token? HTTP/1.1 
200 
Java/1.8.0_201

您可以查看此演示以了解它是如何工作的,还可以查看操作的时间安排。至于你的方法,你可以计时,看看哪个更好。

请注意,此模式适用于您提供的特定示例,我试图使其尽可能通用,但由于您没有提供更多示例或有关字符串结构的更多详细信息,因此在其他输入上可能会失败。


推荐阅读