一、正则表达式re模块
1.转义符号
在有特殊意义或者特殊功能的符号前加\,让他特殊的功能和意义消失
注意:独立的有特殊意义的符号,在[]中,它的特殊意义会自动消失
re_str = r'[+.*]abc\.123[.]23'
print(re.fullmatch(re_str, '+abc.123.23'))
2.re模块
1)compile(正则表达式) - 编译创建正则表达式对象
2)fullmatch(正则表达式, 字符串) - 让正则表达式和整个字符串进行匹配,如果匹配成功,返回匹配对象
如果匹配失败,返回None
result = re.fullmatch(r'(\d{3})([a-z]{3})', '123asd')
print(result)
匹配对象:
a.获取匹配结果:
匹配对象.group() - 获取整个正则表达式获取到的结果
匹配对象.group(N) - 获取第N个分组匹配到的结果
print(result.group()) # 123
print(result.group(2)) # asd
b.获取匹配结果在源字符串中的范围
匹配对象.span()
匹配对象.span(N)
print(result.span()) # (0, 6)
print(result.span(2)) # (3, 6)
c.获取源字符串
源字符串.string
print(result.string) # 123asd
- match(正则表达式,字符串) - 让字符串开头和正则表达式进行匹配,返回值是匹配对象或None
print(re.match(r'\d{3}', '7832as')) # <re.Match object; span=(0, 3), match='783'>
- search(正则表达式,字符串) - 在字符串中查找第一个满足正则表达式的子串;返回值是匹配对象或None
print(re.search(r'\d{3}', 'ad2342wqe123')) # <re.Match object; span=(2, 5), match='234'>
- findall(正则表达式,字符串) - 获取字符串中所有满足正则表达式的子串;返回值是一个列表,列表中的元素是字符串,当存在一个分组的时候,列表只取分组中的内容,当存在两个或两个以上分组的时候,列表将各分组中的内容最为元素存在元组中
print(re.findall(r'\d{3}', 'asd12312asd3421'))
# ['123', '342']print(re.findall(r'\d+[a-z]{2}', 'as890ds98asd098qwd'))
# ['890ds', '98as', '098qw']print(re.findall(r'(\d+)[a-z]{2}', 'as890ds98asd098qwd'))
# ['890', '98', '098']print(re.findall(r'(\d+)([a-z]{2})', 'as890ds98asd098qwd')) # [('890', 'ds'), ('98', 'as'), ('098', 'qw')]
- finditer(正则表达式,字符串) - 获取字符串中所有满足正则表达式的字符串,返回的是迭代器,迭代器中的元素是匹配对象
result = re.finditer(r'(\d+)([a-z]{2})', 'as890ds98asd098qwd')print(list(result))# [<re.Match object; span=(2, 7), match='890ds'>, <re.Match object; span=(7, 11), match='98as'>, <re.Match object; span=(12, 17), match='098qw'>]
- split(正则表达式,字符串) - 一正则表达式匹配到的子串作为切割点,对字符串进行切割,返回值是列表,列表中的元素是字符串
result = re.split(r'\d+', 'as890ds98asd098qwd123')
print(result) # ['as', 'ds', 'asd', 'qwd', '']
- sub(正则表达式, 字符串1, 字符串2) - 将字符串2中满足正则表达式的子串全部替换成字符串1
result = re.sub(r'\d+', 'and', 'as890ds98asd098qwd123')print(result)
# asanddsandasdandqwdand
- 参数flags
以上所有的函数都有一个参数flags,可以加re.I表示匹配的时候忽略大小写,加re.S表示单行匹配(默认多行匹配)多行和单行的主要区别:多行匹配.不能和\n进行匹配,单行.可以和\n匹配
print(re.fullmatch(r'a.b', 'a\nb', flags=re.S)) # <re.Match object; span=(0, 3), match='a\nb'>
print(re.fullmatch(r'a.b', 'a\nb')) # None
二、网络基础-socketServer
1.socket编程
socket又叫套接字
socket编程其实就是用代码来实现进行网络通信的两个端;套接字就是实现通信的两个程序
实现通信的两个端分为服务器金额客户端两种
python通过socket模块来提供套接字编程相关的类和方法,其中socket这个类就是套接字对应的类
2.服务器端的实现
1)创建套接字对象(买电话机)
socket(family = AF_INET, type = SOCK_STREAM)
family - 设置ip类型,AF_INET对应的是ipv4,AF_INET6对应的是ipv6
type - 设置传输类型,SOCK_STREAM对应的是TCP协议,SOCK_DGRAM对应的是UDP协议
server = socket.socket()
2)绑定ip和端口(插电话线)
bind((ip地址, 端口))
ip地址:找到互联网中唯一的一台计算机;赋值Ip地址对应的字符串
端口:区分同一台计算机中不同的服务(程序);赋整数,值的范围是065535;其中01024属于著名端口
同一时间同一个端口只能对应一个服务
server.bind(('10.7.156.69', 12345))
3)开始监听(等电话)
server.listen(512)
print('开始监听。。。')
4)保持通信(保持电话一直可用)
while 1:
# 5)接受客户端的请求(接电话),返回为这个客户端创建的独立的套接字对象(分机)和客户端的地址
# 当程序运行到这句代码的时候会停下来,直到有请求为止
connection, address = server.accept()
# 6) 接收消息(听别人说)
# recv(一次性能接受的数据的大小) - 返回接收到的数据,数据类型是二进制
recv_data = connection.recv(1024)
print(recv_data.decode(encoding='utf-8'))
# 7) 发送消息(说给别人听)
# send(需要发送的数据)
connection.send('HTTP/1.1 200 OK\r\n\r\n 你好'.encode())
# 关闭连接
connection.close()
三、socketClient
# 1.客户端套接字
# 1) 创建套接字对象(买电话)
client = socket.socket()
# 2) 连接服务器(拨号)
client.connect(('10.7.156.52', 12345))
# 3) 发送消息
client.send('服务器你好'.encode())
# 4) 接受消息
re_data = client.recv(1024)
print(re_data.decode(encoding='utf-8'))
# 5) 关闭连接
client.close()