我正在尝试提取从日志文件中访问的唯一文件。即"GET /socview/svspring01D.htm HTTP/1.1"*
因为我知道我希望编写正则表达式以提取所有这些文件的格式。我已经完成了这个,但我并不满意。我很感激一些帮助(我是编程新手)
另外,由于我可以使用GET
作为起点,我不希望将其提取为字典,有没有办法做到这一点?我正在使用字典来计算每个文件的访问次数。
match = re.search (r'^GET.*\.1' ,logfile)
答案 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']