day 08 python正则表达式,socket网络编程(TCP/UDP)
正则表达式re
import re
a = re.match('f..', 'food')
print(a.group()) # 从左至右匹配,匹配到返回值,匹配不到返回None
b = re.findall('f..', 'seafood is food')
print(b) # 返回所有匹配项组成的列表,['foo', 'foo']
result = re.findall('f..', 'seafood is food')
for c in result: # 从迭代器中逐个去除匹配的对象
print(c)
d = re.sub('f..', 'abc', 'seafood is food') # 用abc替换f开始的三位
print(d) # seaabcd is abcd
e = re.split('-|\.', 'hello-world.tar.gz') # 切割,用-或这.,.需要转义
print(e) # ['hello', 'world', 'tar', 'gz']
patt = re.compile('f..') # 先把要匹配的模式编译,提升效率
f = patt.search('seafood') # 指定在哪个字符串中匹配和匹配的方式
print(f.group()) # foo
正则表达式提取nginx日志中的IP地址和部分浏览器访问的次数
import re
def count_patt(fname, patt):
cpatt = re.compile(patt)
result = {}
with open(fname) as fobj:
for line in fobj:
m = cpatt.search(line)
if m:
key = m.group()
result[key] = result.get(key, 0) + 1
return result
if __name__ == '__main__':
fname = '/var/log/nginx/access.log'
ip='^(\d+\.){3}\d+'
print(count_patt(fname, ip))
print('')
br = "Firefox|MSIE|Chrome"
print(count_patt(fname, br))
使用正则表达式加排序,检测nginx日志中ip的次数,排序
import re
from collections import Counter
class CountPatt:
def __init__(self, fname):
self.fname = fname
def count_patt(self, patt):
cpatt = re.compile(patt)
result = Counter()
with open(self.fname) as fobj:
for line in fobj:
m = cpatt.search(line)
if m:
result.update([m.group()])
return result
if __name__ == '__main__':
c = CountPatt('/var/log/nginx/access.log')
ip = '^(\d+\.){3}\d+'
br = "Firefox|MSIE|Chrome"
a = c.count_patt(ip)
print(a)
print(a.most_common(2))
print(c.count_patt(br))
网络编程
c/s结构
套接字 (基于网络的套接字:AF_INET)
绑定地址 绑定端口号
面向连接的主要协议就是传输控制协议TCP,套接字类型为:SOCK_STREAM
无连接的主要协议是用户数据包协议UDP,套接字类型为:SOCK_DGRAM
Python中使用socket模块中的socket函数实现套接字的创建。(套接字:可以理解为一个接口,好比网卡上插网线的接口)
创建TCP服务器
创建TCP服务器的主要步骤:
1、创建服务器套接字: s = socket.socket()
2、绑定地址到套接字: s.bind()
3、启动监听:s.listen()
4、接受客户端链接:s.accepy()
5、与客户端通信:recv() / send()
6、关闭套接字:s.close()
import socket
host = '' # 表示本机所有地址,类似0.0.0.0
port = 12345 # 端口,应该大于1024
addr = (host, port)
s = socket.socket() # 默认值就是基于TCP的网络套接字
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 设置选项,程序结束之后可以立即再运行,否则要等60秒
s.bind(addr) # 绑定地址到套接字
s.listen(2) # 启动侦听进程2个,目前都是单进程的进程,写几无所谓
cli_sock, cli_addr = s.accept() # 等待客户端链接
print('客户端来自:', cli_addr) # 连上来之后服务端输出
print(cli_sock.recv(1024)) # 一次最多读1024个字节
cli_sock.send(b'I R E') # 给客户端发送数据,数据要求是bytes类型
cli_sock.close()
s.close()
创建一个可以连续收发消息的服务端
import socket
host = ''
port = 12345
addr = (host, port)
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen(1)
while True:
cli_sock, cli_addr = s.accept()
print('Client connect from:', cli_addr)
while True:
data = cli_sock.recv(1024)
if data.strip() == b'end':
break
print(data.decode('utf8')) # bytes类型转为string类型
data = input('> ') + '\r\n' # 获得的是string类型
cli_sock.send(data.encode('utf8')) # 转成bytes类型发送
cli_sock.close()
创建TCP客户端
1.创建TCP客户端套接字:
cs=socket.socket()
2.连接服务器:
cs.connect()
3.与服务器通信:
cs.send() cs.recv()
4.关闭客户端套接字
cs.close()
连接服务端发送消息
import socket
host = '127.0.0.1' # 地址
port = 12345 # 服务端端口
addr = (host, port)
c = socket.socket() # 启动socket
c.connect(addr) # 连接
while True:
data = input('> ') + '\r\n' # 输入
c.send(data.encode('utf8')) # 转换成utf8
if data.strip() == 'end':
break
data2 = c.recv(1024) # 接受服务端的数据
print(data2.decode('utf8')) # 转换成utf8
c.close() # 关闭
结果


创建UDP服务器
创建UDP服务器的主要步骤:
1.创建服务器套接字:
s = socket.socket()
2.绑定服务器套接字:
s.bind()
3.接收、发送数据:
s.recvfrom() ss.sendto()
4:关闭套接字:
s.close()
创建UDP客户端
创建UDP客户端主要步骤:
1.创建客户端套接字:
cs = socket.socket()
2.与服务器通信:
cs.sendto()
cs.recvfrom()
3.关闭客户端套接字:
cs.close()
使用OOP,编写TCP服务器,接受参数,返回时间+参数
import socket
from time import strftime
class TcpTimeServer:
def __init__(self, host='', port=12345):
self.addr = (host, port)
self.server = socket.socket()
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server.bind(self.addr)
self.server.listen(1)
def chat(self, client_sock):
while True:
data = client_sock.recv(1024)
clock = strftime('%H:%M:%S')
if data == b'quit':
break
data = '[%s] %s' %(clock, data.decode('utf8'))
client_sock.send(data.encode('utf8'))
client_sock.close()
def mainloop(self):
while True:
client_socket, client_addr = self.server.accept()
self.chat(client_socket)
self.server.close()
if __name__ == '__main__':
server = TcpTimeServer()
server.mainloop()