正则表达式

文章介绍了如何使用正则表达式在给定的字符串和HTML/JavaScript代码中寻找特定信息,如最长单词、新闻访问次数和多行日志中的异常描述。
摘要由CSDN通过智能技术生成

第一题

编程要求

打开右侧代码文件窗口,在 BeginEnd 区域补充代码,完成任务。

给定一个长的字符串(如下所示),请使用正则表达式找出里面最长最靠前的单词,打印输出。字符串较长,请使用较为节省内存空间的方式完成。

给定字符串:

  1. 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 ################

 第二题

编程要求

打开右侧代码文件窗口,在 BeginEnd 区域补充代码,完成任务。

有一个新闻网站,现在需要获取某篇新闻的访问次数,其显示新闻内容的 HTML 示例代码如下:

  1. <article>
  2. <header>
  3. <h2>News title</h2>
  4. </header>
  5. <section class="news_content">
  6. <p>News Content</p>
  7. </section>
  8. <footer>
  9. <p>
  10. Posted on
  11. <time datetime="2048-05-15 19:00">May 15</time>
  12. by Haishion.
  13. Visits: <span id="visits">0</span> .
  14. </p>
  15. </footer>
  16. </article>
  17. <script>
  18. document.getElementById('visits').innerText = '3';
  19. </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])

第三题

编程要求

打开右侧代码文件窗口,在 BeginEnd 区域补充代码,完成任务。

Apache 的访问日志的内容样例如下:

  1. 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"
  2. 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)"
  3. 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"
  4. 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 个页面和次数。

输出示例如下:

  1. [('/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)

第四题

编程要求

打开右侧代码文件窗口,在 BeginEnd 区域补充代码,完成任务。

当一行日志无法记录日志的所有上下文详细信息时,我们会采用多行日志进行记录。多行日志是指一条完整的日志数据跨越多行,例如 Java 程序日志、自定义日志等等。

读取日志文件 /data/bigfiles/program13-error.log,里面包含了多行日志信息,如下所示:

  1. 2020-10-11 09:31:11.878291
  2. Traceback (most recent call last):
  3. File "C:\Python\rogram13-4-generate.py", line 20, in <module>
  4. raise random.choice([
  5. RuntimeError
  6. ......

请编写一个程序,使用正则表达式对日志内容进行解析,输出每一个完整日志的发生时间和异常的简单描述。

输出示例如下:

  1. 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 ################

 

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值