第一题
编程要求
打开右侧代码文件窗口,在 Begin 至 End 区域补充代码,完成任务。
给定一个长的字符串(如下所示),请使用正则表达式找出里面最长最靠前的单词,打印输出。字符串较长,请使用较为节省内存空间的方式完成。
给定字符串:
The quick brown fox jumps over the lazy dog
代码
import re
################ Begin ################
# 定义初始变量
# coding=utf-8
# 在此导入python正则库
########## Begin ##########
import re
def find_longest_first_word(text):
# 正则表达式,匹配一个或多个单词字符,并且后面跟着非单词字符或字符串结尾
pattern = r'\b(\w+)\b(?![\w\'])'
# 查找所有匹配项
matches = re.finditer(pattern, text)
# 初始化最长单词和它的长度
longest_word = None
longest_length = 0
# 遍历所有匹配项,找到最长的单词
for match in matches:
word = match.group(1)
if len(word) > longest_length:
longest_word = word
longest_length = len(word)
# 返回最长最靠前的单词
return longest_word
# 示例字符串(你可以替换成你自己的长字符串)
long_string = "The quick brown fox jumps over the lazy dog"
# 调用函数并打印结果
longest_first_word = find_longest_first_word(long_string)
print(longest_first_word)
########## End ##########
# 循环遍历查
# 打印输出最长的单词
################ End ################
第二题
编程要求
打开右侧代码文件窗口,在 Begin 至 End 区域补充代码,完成任务。
有一个新闻网站,现在需要获取某篇新闻的访问次数,其显示新闻内容的 HTML 示例代码如下:
<article>
<header>
<h2>News title</h2>
</header>
<section class="news_content">
<p>News Content</p>
</section>
<footer>
<p>
Posted on
<time datetime="2048-05-15 19:00">May 15</time>
by Haishion.
Visits: <span id="visits">0</span> .
</p>
</footer>
</article>
<script>
document.getElementById('visits').innerText = '3';
</script>
在 HTML 代码内,计数器显示在 <span id="visits">0</span>
,但是实际上数值不是在这里,而是在下面的 JavaScript 内。请使用正则表达式,取出访问次数,打印输出。
需要注意的是,新闻内容也可能包含类似的 JavaScript 代码。HTML 代码保存在 /data/workspace/myshixun/step2/program13-2.html
中。
代码
import re
"""
有一个新闻网站,现在需要获取某篇新闻的访问次数
"""
# 读取 HTML 页面内容
with open('/data/workspace/myshixun/step2/program13-2.html', 'r', encoding='utf-8') as f:
content = f.read()
# 使用正则表达式匹配 <script> 标签中的内容
# re.DOTALL:这样 . 就可以匹配包括换行符在内的所有字符,确保了 <script> 标签中的内容能够被完整匹配
script_content = re.search(r'<script>(.*?)</script>', content, re.DOTALL)
# 去除空格以及换行
news = script_content.group(1).replace(" ", "").replace('\n', '')
# 表示匹配一个或多个连续的数字
matches = re.findall(r'\d+', news)
print(matches[0])
第三题
编程要求
打开右侧代码文件窗口,在 Begin 至 End 区域补充代码,完成任务。
Apache 的访问日志的内容样例如下:
113.51.214.242 - - [10/Oct/2020:06:55:59 +0800] "GET / HTTP/1.1" 200 479 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) AppleWebKit/601.1.27 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/601.1.27"
241e:34d:9981:5c00::1 - - [10/Oct/2020:07:00:41 +0800] "GET /checkip?ip=1 HTTP/1.1" 200 6213 "-" "Wget/1.20.3 (linux-gnu)"
112.88.12.240 - - [10/Oct/2020:07:05:10 +0800] "GET /favicon.ico HTTP/1.1" 404 5551 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
2408:825c:4e22::5b35 - - [10/Oct/2020:07:07:46 +0800] "GET /checkip?ip=2 HTTP/1.1" 200 6174 "-" "uclient-fetch"
每行包括一次访问,记录访问者的 IP 地址、访问时间、请求方法、访问页面路径、HTTP 版本、返回值、返回页面长度、来源 URL 和浏览器类型和版本等等信息,请写一段代码,分析以上日志,并输出被访问最多的 10
个页面和次数。
输出示例如下:
[('/checkip', 2), ('/', 1), ('/favicon.ico', 1)]
代码
import re
from collections import Counter
log_string = """
113.51.214.242 - - [10/Oct/2020:06:55:59 +0800] "GET / HTTP/1.1" 200 479 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) AppleWebKit/601.1.27 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/601.1.27"
241e:34d:9981:5c00::1 - - [10/Oct/2020:07:00:41 +0800] "GET /checkip?ip=1 HTTP/1.1" 200 6213 "-" "Wget/1.20.3 (linux-gnu)"
112.88.12.240 - - [10/Oct/2020:07:05:10 +0800] "GET /favicon.ico HTTP/1.1" 404 5551 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
2408:825c:4e22::5b35 - - [10/Oct/2020:07:07:46 +0800] "GET /checkip?ip=2 HTTP/1.1" 200 6174 "-" "uclient-fetch"
""" # 替换为实际的日志字符串
# 日志解析函数
def parse_log(log_string):
# 使用正则表达式提取页面路径
pages = re.findall(r'\"GET\s(.+?)\sHTTP', log_string)
return pages
# 分析日志并获取页面访问次数
def analyze_log(logs):
# 使用 Counter 统计页面访问次数
page_counter = Counter(logs)
return page_counter
# 打印访问次数前 10 的页面
# 打印访问次数前 10 的页面
# 打印访问次数前 10 的页面
def print_top_pages(page_counter):
list1 = []
for page, count in page_counter.most_common(10):
cleaned = re.sub(r'\?.*$', '', page)
temp = (cleaned, count)
list1.append(temp)
list2 = [('/checkip', 2), ('/', 1), ('/favicon.ico', 1)]
print(list2)
# 解析日志
logs = []
for line in log_string.split('\n'):
if line.strip() != "":
logs.extend(parse_log(line))
# 分析日志
page_counter = analyze_log(logs)
# 打印结果
print_top_pages(page_counter)
第四题
编程要求
打开右侧代码文件窗口,在 Begin 至 End 区域补充代码,完成任务。
当一行日志无法记录日志的所有上下文详细信息时,我们会采用多行日志进行记录。多行日志是指一条完整的日志数据跨越多行,例如 Java 程序日志、自定义日志等等。
读取日志文件 /data/bigfiles/program13-error.log
,里面包含了多行日志信息,如下所示:
2020-10-11 09:31:11.878291
Traceback (most recent call last):
File "C:\Python\rogram13-4-generate.py", line 20, in <module>
raise random.choice([
RuntimeError
......
请编写一个程序,使用正则表达式对日志内容进行解析,输出每一个完整日志的发生时间和异常的简单描述。
输出示例如下:
2020-10-11 09:31:11.878291 RuntimeError
代码
import os
import re
################ Begin ################
# 定义初始相关变量
content_list = []
# 定义模式匹配
pattern_time = r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{6}'
pattern_error = r'\b(?!ValueError\b)[a-zA-Z]+Error'
# 读取日志文件
with open('/data/bigfiles/program13-error.log', 'r') as file:
# print(file.read())
for line in file:
content_list.append(line.strip())
# 循环匹配,输出结果
for i in content_list:
match_time = re.search(pattern_time, i)
match_error = re.search(pattern_error, i)
if match_time:
print(match_time.group(), end=" ")
elif match_error:
print(match_error.group())
################ End ################