Python语言基础20:re模块的核心函数和方法

本文为Python语言基础的学习笔记,重点探讨re模块的核心函数和方法。通过编写count_patt.py脚本,实现了分析Apache日志的功能,统计每个客户端的访问次数,特别是针对Firefox和MSIE的访问。脚本采用函数式编程和面向对象编程两种方式实现,展示re模块在日志分析中的实际运用。
摘要由CSDN通过智能技术生成

Python语言基础20:re模块的核心函数和方法 学习笔记

# 核心函数和方法

import re

# match 函数
# 尝试用正则表达式从字符串的开头匹配,
#   如果匹配成功,则返回一个匹配对象,否则返回None
m1 = re.match('fo','food') # 匹配
m2 = re.match('fo','nfood') # 不匹配
print(m1)
print(m2)

# search 函数
# 在字符串中,查找正则表达式模式的第一次出现,
#   如果匹配成功,则返回一个匹配对象,否则返回None
s1 = re.search('foo','food')
s2 = re.search('fo','nsfood') # 可以匹配到中间的字符
print(s1)
print(s2)

# group方法
# 使用match或search匹配成功后,
#   返回的匹配对象可以通过group方法获得匹配内容
print(m1.group())
print(s1.group())

# findall 函数
# 在字符串中查找正则表达式模式的所有(非重复)出现;返回一个匹配对象的列表
f = re.findall('foo','seafood is food') # 匹配所有匹配项
m3 = re.search('foo','seafood is food') # 匹配第一次出现的foo
print(f)
print(m3.group())

# finditer 函数
# 和findall() 函数有相同的功能,
#   但返回的不是列表而是迭代器,对于每一个匹配,该迭代器返回一个匹配对象
f2 = re.finditer('fo','seafood is food')
for item in f2:
    print(item.group())

# compile 函数
# 对正则表达式模式进行编译,返回一个正则表达式对象
# 不是必须要用这种方式,但是在大量匹配的情况下,可以提升效率
c = re.compile('foo')
c2 = c.match('food')
print(c2.group())

# split 方法
# 根据正则表达式中的分隔符把字符分割为一个列表,并返回成功匹配的列表
# 字符串也有类似的方法,但是正则表达式更加灵活
mylist = re.split('\.|-','hello-world.data-python')
print(mylist)

# sub 方法
# 把字符串中所有匹配正则表达式的地方替换成新的字符串
s3 = re.sub('X','X Mr.James','Dear X')
print(s3)

编写count_patt.py脚本,实现一个apche日志分析脚本

  1. 统计每个客户端访问apache服务器的次数
  2. 将统计信息通过字典的方式显示出来
  3. 分别统计客户端是Firefox和MSIE的访问次数
  4. 分别使用函数式编程和面向对象编程的方式实现
# 分析Apache 访问日志
import re
import collections
# 方法一
# fname 文件地址,patt 正则表达式
def count_patt(fname,patt):
    counter = collections.Counter()

    cpatt = re.compile(patt)
    with open(fname) as fobj:
        for line in fobj:
            m = cpatt.search(line)
            if m:
                counter.update([m.group()])
    return counter

if __name__ == "__main__":
    fname = 'access_log.txt'
    ip_patt = '^(\d+\.){3}\d+'
    a = count_patt(fname,ip_patt)
    print(a)

    br_patt = 'FireFox|MSIE|Chrome'
    b = count_patt(fname,br_patt)
    print(b)

# 方法二
class CountPatt:
    def __init__(self,patt):
        self.cpatt = re.compile(patt)

    def count_patt(self,fname):
        counter = collections.Counter()

        with open(fname) as fobj:
            for line in fobj:
                m = self.cpatt.search(line)
                if m:
                    counter.update([m.group()])
        return counter

if __name__ == "__main__":
    fname = "access_log.txt"
    ip_patt = "^(\d+\.){3}\d+"
    br_patt = "Firefox|MSIE|Chrome"
    ip = CountPatt(ip_patt)
    print(ip.count_patt(fname))

    br = CountPatt(br_patt)
    print(br.count_patt(fname))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值