python学习笔记(8.网络编程9.正则表达式10.递归)

1.网络编程

1.Socket

Socket 负责进程之间的网络数据传输,好比数据的搬运工。进程之间想要进行网络通信需要 socket。

2 个进程之间通过 Socket 进行相互通讯,就必须有服务端和客户端

服务端:等待其它进程的连接、可接受发来的消息、可以回复消息 Socket

客户端:主动连接服务端、可以发送消息、可以接收回复

2.服务端开发

import socket
# 创建socket对象
socket_server = socket.socket()
# 绑定ip地址和端口
socket_server.bind(("localhost", 8888))
# 监听端口 listen方法接受一个整数参数,表示接受的链接数量
socket_server.listen(1)
# 等待客户端连接
# accpet方法返回的是二元元组(链接对象, 客户端地址信息)
# 可以通过 变量1, 变量2 = socket_server.accept() 接受
# accpet()是阻塞方法, 等待客户端的连接, 如果没有就不会继续执行
conn, address = socket_server.accept()
print(f"接受到了客户端的信息,客户端地址信息为:{address}")
while True:
    # 接受客户端信息 要使用连接对象,不是socket_server对象
    # recv方法返回的是一个字节数组(bytes对象),不是字符串,也是阻塞方法
    # 可以通过decode方法使用UTF-8编码,将字节数组转换为字符串对象
    data = conn.recv(1024).decode("UTF-8")
    print(f"客户端发来的信息是:{data}")
    # 发送回复消息
    # encode可以将字符串编码转换为字节数组对象
    msg = input("请输入你和客户端回复的信息:")
    if msg == 'exit':  # 使用exit关闭
        break
    conn.send(msg.encode("UTF-8"))  # 发送回去
# 关闭连接
conn.close()
socket_server.close()

3.客户端编程

import socket
# 创建对象
socket_client = socket.socket()
# 连接服务器
socket_client.connect(("localhost", 8888))
while True:
    # 发送消息
    msg = input("发送消息:")
    if msg == 'exit':
        break
    socket_client.send(msg.encode("UTF-8"))
    # 接受消息
    recv_data = socket_client.recv(1024)    # 1024是缓冲区大小, 一般大小1024即可,同样recv方法是阻塞的
    print(f"服务端消息:{recv_data.decode('UTF-8')}")
# 关闭连接
socket_client.close()

2.正则表达式

正则表达式,又称规则表达式(Regular Expression),是使用单个字符串来描述、匹配某个句法规则的字符串,常被用来检索、替换那些符合某个模式(规则)的文本。

字符串定义规则,并通过规则去验证字符串是否匹配。

正则规则: (^[\w-]+(。[\w-]+)*@[\w-]+(.[\w-]+)+$) 即可匹配一个字符串是否是标准邮箱格式

1.基础匹配

re.match(匹配规则, 被匹配字符串)从头匹配

import re
s = 'aaa bbb ccc ddd eee fff'
result = re.match('aaa', s)
print(result)   # 从头开始匹配,必须从头一样
print(result.span())
print(result.group())
# 结果
# <re.Match object; span=(0, 3), match='aaa'>
# (0, 3)
# aaa

search(匹配规则, 被匹配字符串)搜索整个字符串,从前向后,找一个

import re
s = 'aaa bbb ccc ddd eee aaa fff'
result = re.search('aaa', s)
print(result)
print(result.span())
print(result.group())
# 结果
# <re.Match object; span=(0, 3), match='aaa'>
# (0, 3)
# aaa

findall(匹配规则, 被匹配字符串)匹配整个字符串,找出全部匹配项

import re
s = 'aaa bbb ccc ddd eee aaa fff'
result = re.findall('aaa', s)
print(result)
# 结果
# ['aaa', 'aaa'] 

2.元字符匹配

1.单字符匹配

2.数量匹配
3.边界匹配
4.分组匹配
re.findall(r'\d', s) # 全部数字
re.findall(r'\W', s) # 特殊字符
re.findall(r'[a-zA-Z]', s) # 找出全部英文字母
# []内可以写:[a-zA-Z0-9] 这三种范围组合或指定单个字符如[aceDFG135]
# 匹配账号,只能由字母和数字组成,长度限制6到10位
规则为: ^[0-9a-zA-Z]{6,10}$
# 匹配QQ号,要求纯数字,长度5-11,第一位不为0
规则为:^[1-9][0-9]{4,10}& # {,}没有空格
[1-9]匹配第一位,[0-9]匹配后面4到10位
# 匹配邮箱地址,只允许qq、163、gmail这三种邮箱地址
规则为:^[\w-]+(\.[\w-]+)*@(qq|163|gmail)(\.[\w-]+)+&
[\w-]+ 表示出现a-z A-Z 0-9 _ 和 - 字符最少一个,最多不限
(\.[\w-]+)*,表示出现组合 . 和 a-z A-Z 0-9 _  -的组合最少0次,最多不限
用于匹配:abc.ced.efg@123.com中的ced.efg这部分
@表示匹配@符号
(qq|163|gmail)表示只匹配这3个邮箱提供商
(\.[\w-]+)+表示a-z A-Z 0-9 _  -的组合最少1次,最多不限
用于匹配abc.ced.efg@123.com.cn中的.com.cn这种
最后使用+表示最少一次,即比如:.com
多了可以是:.com.cn.eu这样 

3.递归

递归在编程中是一种非常重要的算法 递归: 即方法(函数)自己调用自己的一种特殊编程写法

os.listdir,列出指定目录下的内容

os.path.isdir,判断给定路径是否是文件夹,是返回 True,否返回 False

os.path.exists,判断给定路径是否存在,存在返回 True,否则返回 False

import os
def get_files_recursion_from_dir(path):
    print(f"当前判断文件:{path}")
    file_list = []
    if os.path.exists(path):
        for f in os.listdir(path):
            new_path = path + "/" + f
            if os.path.isdir(new_path):
                file_list += get_files_recursion_from_dir(new_path)
            else:
                file_list.append(new_path)
    else:
        print(f"指定的目录{path},不存在")
        return []
    return file_list
if __name__ == '__main__':
    print(get_files_recursion_from_dir("D:/python文件/学习/Python进阶/递归测试"))
#当前判断文件:D:/python文件/学习/Python进阶/递归测试
#当前判断文件:D:/python文件/学习/Python进阶/递归测试/a
#当前判断文件:D:/python文件/学习/Python进阶/递归测试/a/b
#['D:/python文件/学习/Python进阶/递归测试/1.txt', 'D:/python文件/

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值