No.27网络基础

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('组名')

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.网编框架

2.网络基础

  • 两个运行中的程序如何传递信息?

    • 通过文件

    No.27网络基础

  • 两台机器上的两个运行中的程序如何通信?

    • 通过网络

2.1网络应用开发架构

No.27网络基础

No.27网络基础

  • C/S 架构
    • client 客户端
    • server 服务端
    • 迅雷 / qq / 浏览器 / 输入法 / 百度云 / pycharm / git / VNC / 红蜘蛛 / 游戏
  • B/S 架构
    • browser 浏览器
    • server 服务端
    • 淘宝 / 邮箱 / 百度 / 博客园 / 知乎 / 抽屉 / 游戏
  • B/S和C/S架构的关系
    • B/S是特殊的C/S架构

2.2网络基础知识

No.27网络基础

  • 网卡:一个实际存在于计算机中的硬件
  • mac地址:每一个网卡上都有一个全球唯一的mac地址

No.27网络基础

  • 交换机:是连接多台机器并帮助通讯的物理设备,只认识mac地址。
  • 协议:两台物理设备之间对于要发送的内容、长度、顺序的一些约定。

No.27网络基础

  • 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
  • 公网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
    # 循环上面过程,直到把所有的乘除法计算完成。
    
进阶需求:
	如何解决加减法?
	如何去括号?
	如何处理复杂的符号?
上一篇:import模块


下一篇:LeetCode 85 | 如何从矩阵当中找到数字围成的最大矩形的面积?