1.回顾知识点
1.正则相关的函数
r = re.match('正则表达式',源字符串) # 返回正则对象,如果匹配失败,返回None
r.group () # 返回是符合正则的源字符串
r.groups () # 返回符合正则源字符串中的 分组信息 ' () ' ,以tuple元组格式返回
r.groupdict () # 返回符合正则 (带有分组且有分组名: (?P<分组名>正则 ) ) 的源字符中分组字典信息。
I = re.split( '正则', '源字符串' ) # 返回 以正则表示的字符分源字符串之后的列表
s = re.sub ( '正则 ',新字符, 源字符串 ) # 返回 将源字符串中符合正则的字符替换成新字符之后的字符串
s = re.subn ('正则' ,新字符, 源字符串) # 同sub(),返回元组(替换后的字符,替换次数)
sl = re.findall ('正则','源字符串') # 查找源字符串中符合正则的字符,并返回list, 如果正则中包含分组(),分组的信息以元组tuple方式显示在列表
常用的正则元字符:
[a-zA-Z] : 表示一位任意一位的字母和下划线,表示位数可以使用:
*:(0到多个)
?:(0或者1位)
+:(至少一个)
{n,}: (至少n个)
{n,m}: n到m个
. : 除了特殊符号以外,任意一个字符
[0-9] : 表示一位数字, 等同于 \d
[0-9a-zA-Z _ ] : 数字字母及下划线,及 \w
[^0- 9] : 非数字的任意字符, 等同于 \D
[0-9a-zA-Z _ ] :非数字、字母、下划线的任一字符, \W
\s : 空格、换行、换页、制表 等有空格符号
\S : 非空格的 字符
^ : 行首, 开始位置
$ :行尾, 结束位置
-
socket 网络通信 (基于网络)
socket_family: AF_INET
type: SOCK_STREAM , 主要用于TCP协议的数据传输
1). TCP 通信
面向连接、数据是序列化(二进制方式、字节流bytes),且是连续的,可多次发送
服务端:
s = socket.socket ()
s.bind((host, port ))
s.listen(10) # 10 表示, 允许最大连接数
client, addr = s.accept () 等待客户端的连接, 会阻塞。
解决方案:可以设置等待连接的超时时间在accept()方法的上方设置:s.settimeout(30),默认单位为秒
client.send(b 'hi')
data = client.recv ( 1024 ) # 一次从客户端读取1024字节,即1 k byte
while data:
data = client.recv(1024) # 发送数据结束时,必须发送 “ ” 带空格的字符串
服务端:
s = socket.socket ( )
s.connect ( (host, port) ) # 连接服务器
s.send ( '发送数据'.encode() )
#s.send ( b' ' )
data = s.recv (1024) # 接收数据
print (data.decode() )
3.多线程
1)创建线程
t1 = threading.Thread (target=函数名, args=(参数,))
2)启动线程
t1.start ()
3) 等待线程结束
t1.join () # 当前线程等待 t1 线程结束
4)线程锁 (Lock) :
来保护多个线程对同一资源(变量,对象, 可迭代的对象/数据( iterable ) ) 操作时的安全性, 即在一个资源在加锁后,只能有一个线程来占用,其他线程则等待锁的释放。
1)创建锁: lock = threading.Lock ()
2)加锁:lock.acquire ()
n += 20
3)解锁: lock.release()