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日志分析脚本:
- 统计每个客户端访问apache服务器的次数
- 将统计信息通过字典的方式显示出来
- 分别统计客户端是Firefox和MSIE的访问次数
- 分别使用函数式编程和面向对象编程的方式实现
# 分析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))