日志文件的正则表达式

时间:2017-04-12 12:38:29

标签: python regex

我正在尝试提取从日志文件中访问的唯一文件。即"GET /socview/svspring01D.htm HTTP/1.1"*

因为我知道我希望编写正则表达式以提取所有这些文件的格式。我已经完成了这个,但我并不满意。我很感激一些帮助(我是编程新手) 另外,由于我可以使用GET作为起点,我不希望将其提取为字典,有没有办法做到这一点?我正在使用字典来计算每个文件的访问次数。

match = re.search (r'^GET.*\.1' ,logfile)

2 个答案:

答案 0 :(得分:0)

使用以下正则表达式:

^GET ([^\s]+).*$

然后匹配第一个组$1以获取文件名及其路径。 ^字符匹配字符串的开头,([^\s]+)匹配每个字符(尽可能多),直到下一个空白字符并形成匹配组。这是一个实例:https://regex101.com/r/pY7N0H/2

如果您只想匹配没有路径的文件名,可以使用以下正则表达式并查找第一个匹配$1(它需要相对路径,从/开始):

^GET (?:\/[^\/\s]+)*\/([^\s]+).*$

以下是一个实例:https://regex101.com/r/SdXViV/1

答案 1 :(得分:0)

您可以使用(demo on regex101.com):

(?:GET|POST)\s+(/\S+)
# GET or POST
# followed by whitespaces
# (capture / and no whitespaces at least once)

<小时/> 在Python中,这将是:

import re

rx = re.compile(r'(?:GET|POST)\s+(/\S+)')

string = """
"GET /socview/svspring01D.htm HTTP/1.1"*
"GET /socvdsdiew/svspring0fsff323231D.htm HTTP/1.1"*
"GET /socvhdhdhdiew/svspring0323231D.htm HTTP/1.1"*
"POST /socddssdview/sveweweasd423232spring01D.htm HTTP/1.1"*
"""

files = rx.findall(string)
print(files)
# ['/socview/svspring01D.htm', '/socvdsdiew/svspring0fsff323231D.htm', '/socvhdhdhdiew/svspring0323231D.htm', '/socddssdview/sveweweasd423232spring01D.htm']