No.27
今日概要
- 网络基础
内容回顾
1.re模块
- findall
- 找到所有符合规则的项,返回一个列表。
- search
- 找到第一个符合规则的项,返回一个对象。
- match
- 从头开始找到第一个符合规则的项,返回一个对象。
- finditer
- 找到所有符合规则的项,返回一个迭代器。
- compile
- 预编译一个正则规则,节省多次使用同一个正则规则的编译时间。
- sub
- 根据正则规则替换,默认替换所有,可以使用替换深度参数。
- subn
- 根据正则规则替换,返回一个元组。
- split
- 根据正则规则切割,返回一个列表,默认不保留切掉的内容。
2.分组
- 分组命名
- (?P<组名>正则)
- 引用分组
- (?P=组名)
- findall和分组
- 优先显示分组中的内容
- (?:)取消这个分组的优先
- split和分组
- split会保留正则中分组内匹配到的内容
- search和分组
- search取分组中的内容
- 通过索引取 obj.group(1)
- 通过组名取 obj.group('组名')
- search取分组中的内容
3.补充
- 正则基本写法
- r''元字符 量词 惰性符号''
- [ ] [^]
- 带有特殊意义的元字符到字符组内大部分都会取消它的特殊意义
- 会取消
- [ () + * .]
- [ - ] - 的位置决定了它的意义,写在字符组的 第一个位置/最后一个位置 就表示一个普通横杠,写在字符组其它任何位置都表示一个范围。
- 会取消
- 带有特殊意义的元字符到字符组内大部分都会取消它的特殊意义
4.习题
#1 找出<h1>123fh</h1><h2>hado</h2>中所有标签内的字符串
import re
ret = re.findall('<.*?>(.*?)<.*?>', '<h1>123fh</h1><h2>hado</h2>')
print(ret)
#2 找出四则运算表达式中的第一个乘除法
\d+(\.\d+)?[*/]-?\d(\.\d+)
#3 检测用户输入的内容是否是一个合法的身份证号
import re
inp = input('>>>').strip()
re.match('[1-9]\d{14}(\d{2}[\dx])?$', inp)
re.search('^[1-9]\d{14}(\d{2}[\dx])?$', inp)
内容详细
1.网编框架
- 网络基础(https://www.cnblogs.com/Eva-J/articles/8244551.html)
- 基于tcp协议和udp协议的socket
- 解决tcp协议的粘包问题
- 并发问题
2.网络基础
-
两个运行中的程序如何传递信息?
- 通过文件
-
两台机器上的两个运行中的程序如何通信?
- 通过网络
2.1网络应用开发架构
- C/S 架构
- client 客户端
- server 服务端
- 迅雷 / qq / 浏览器 / 输入法 / 百度云 / pycharm / git / VNC / 红蜘蛛 / 游戏
- B/S 架构
- browser 浏览器
- server 服务端
- 淘宝 / 邮箱 / 百度 / 博客园 / 知乎 / 抽屉 / 游戏
- B/S和C/S架构的关系
- B/S是特殊的C/S架构
2.2网络基础知识
- 网卡:一个实际存在于计算机中的硬件
- mac地址:每一个网卡上都有一个全球唯一的mac地址
- 交换机:是连接多台机器并帮助通讯的物理设备,只认识mac地址。
- 协议:两台物理设备之间对于要发送的内容、长度、顺序的一些约定。
-
IP地址:
- IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。
- ipv4协议
- 点分十进制,32位2进制表示
- 0.0.0.0 ~ 255.255.255.255
- ipv6协议
- 冒分十六进制,128位2进制表示
- 0:0:0:0:0:0 ~ FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
- ipv4协议
- IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节)。IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数。
-
公网IP
- 为什么外地朋友的电脑我们访问不了?非公网IP。
- 每一个IP地址要想被所有人访问到,那么这个IP地址必须是你申请的公网IP。
-
内网IP
- 192.168.0.0 ~ 192.168.255.255
- 172.16.0.0 ~ 172.31.255.255
- 10.0.0.0 ~ 10.255.255.255
-
交换机实现的arp协议
- 通过IP地址获取一台机器的mac地址
-
网关IP
- 一个局域网的网络出口,访问局域网之外的区域都需要经过路由器和网关。
-
网段
- 一个地址段 x.x.x.0 / x.x.0.0 / x.0.0.0
-
子网掩码
-
判断两台机器是否在同一个网段内 255.255.255.0 / 255.255.0.0 / 255.0.0.0
#子网掩码:255.255.255.0 #对应二进制:11111111.11111111.11111111.00000000 # A机器IP:192.168.12.87 # IP二进制:11000000.10101000.00001100.01010111 # 子网掩码:11111111.11111111.11111111.00000000 # 做与运算 11000000.10101000.00001100.00000000 → 192.168.12.0 # B机器IP:192.168.12.7 # IP二进制:11000000.10101000.00001100.00000111 # 子网掩码:11111111.11111111.11111111.00000000 # 做与运算 11000000.10101000.00001100.00000000 → 192.168.12.0
-
-
port 端口
- 0 ~ 65535
- 一个端口同一时刻只能对一个应用使用
-
IP + port 确认一台机器上的一个应用
2.3socket模块
目录结构
- 文件夹
__init__.py
client.py
server.py
# server.py
import socket
sk = socket.socket() # 买手机
sk.bind(('127.0.0.1', 9000)) # 绑定卡号 127.0.0.1永远表示当前使用机器的地址,不通过交换机。
sk.listen() # 开机
conn, addr = sk.accept() # 等着接电话
conn.send(b'hellow') # 讲话
msg = conn.recv(1024) # 收听
print(msg)
conn.close() # 挂电话
sk.close() # 关机
# client.py
import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 9000))
msg = sk.recv(1024)
print(msg)
sk.send(b'byebye')
sk.close()
# 习题
'''
编程计算器
n = '1-2*((60-30+(-45/5)*(9-2*5/3+7/3*99/4*2998+10*568/14)) - (-4*3)/(16-3*2))'
'''
匹配最内层的表达式
\([^()]+\)
匹配乘除法
\d+(\.\d+)?[*/]-?\d+(\.\d+)?
匹配加减法
\d+(\.\d+)?[+-]-?\d+(\.\d+)?
def mul_div(exp):
# '1*2' '1/2' '1.2*2.4'
pass
def func(exp):
# 1+2*4/5
# 把第一个乘法或者除法找出来,然后交给mul_div函数计算得到结果。
# 再用结果替换原算式 1+2*4/5
# 循环上面过程,直到把所有的乘除法计算完成。
进阶需求:
如何解决加减法?
如何去括号?
如何处理复杂的符号?