日志文件的正则表达式

3

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

因为我知道要提取的格式,所以我想写一个正则表达式来提取所有这些文件。我已经写了一个,但我对它不是很满意。我希望能得到一些帮助(我是编程新手)。 另外,由于我可以使用GET作为起点,所以我不想将其提取到字典中,是否有任何方法可以做到这一点?我正在使用一个字典来计算每个文件被访问的次数。

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

你想要仅获取文件名吗?你使用的编程语言是什么? - Jan
Python,是的,只需文件名。 - Deirdre
2个回答

0
请使用以下正则表达式:
^GET ([^\s]+).*$

然后匹配第一组$1,以获取文件名及其路径。 ^字符匹配字符串的开头,([^\s]+)匹配每个字符(尽可能多地匹配)直到下一个空格字符,并形成匹配组。这是一个实时示例:https://regex101.com/r/pY7N0H/2
如果您只想匹配文件名而不包括路径,可以使用以下正则表达式,并查找第一个匹配项$1(它需要相对路径,以/开头):
^GET (?:\/[^\/\s]+)*\/([^\s]+).*$

这是一个实时示例:https://regex101.com/r/SdXViV/1

0
你可以使用(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']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接