内置模块
1、 os
import os
# 1. 获取当前脚本绝对路径
"""
abs_path = os.path.abspath(__file__)
print(abs_path)
"""
# 2. 获取当前文件的上级目录
"""
base_path = os.path.dirname( os.path.dirname(路径) )
print(base_path)
"""
# 3. 路径拼接
"""
p1 = os.path.join(base_path, \'xx\')
print(p1)
p2 = os.path.join(base_path, \'xx\', \'oo\', \'a1.png\')
print(p2)
"""
# 4. 判断路径是否存在
"""
exists = os.path.exists(p1)
print(exists)
"""
# 5. 创建文件夹
"""
os.makedirs(路径)
"""
"""
path = os.path.join(base_path, \'xx\', \'oo\', \'uuuu\')
if not os.path.exists(path):
os.makedirs(path)
"""
# 6. 是否是文件夹
"""
file_path = os.path.join(base_path, \'xx\', \'oo\', \'uuuu.png\')
is_dir = os.path.isdir(file_path)
print(is_dir) # False
folder_path = os.path.join(base_path, \'xx\', \'oo\', \'uuuu\')
is_dir = os.path.isdir(folder_path)
print(is_dir) # True
"""
# 7. 删除文件或文件夹
"""
os.remove("文件路径")
"""
"""
path = os.path.join(base_path, \'xx\')
shutil.rmtree(path)
"""
- listdir,查看目录下所有的文件
- walk,查看目录下所有的文件(含子孙文件)
import os
"""
data = os.listdir("/Users/dean/PycharmProjects/mkcourse/day14/commons")
print(data)
# [\'convert.py\', \'__init__.py\', \'page.py\', \'__pycache__\', \'utils.py\', \'tencent\']
"""
"""
要遍历一个文件夹下的所有文件,例如:遍历文件夹下的所有mp4文件
"""
data = os.walk("/Users/dean/Documents/mp4")
for path, folder_list, file_list in data:
for file_name in file_list:
file_abs_path = os.path.join(path, file_name)
ext = file_abs_path.rsplit(".",1)[-1]
if ext == "mp4":
print(file_abs_path)
2、 shutil
import shutil
# 1. 删除文件夹
"""
path = os.path.join(base_path, \'xx\')
shutil.rmtree(path)
"""
# 2. 拷贝文件夹
"""
shutil.copytree("/Users/dean/Desktop/图/csdn/","/Users/dean/PycharmProjects/CodeRepository/files")
"""
# 3.拷贝文件
"""
shutil.copy("/Users/dean/Desktop/图/csdn/WX20201123-112406@2x.png","/Users/dean/PycharmProjects/CodeRepository/")
shutil.copy("/Users/dean/Desktop/图/csdn/WX20201123-112406@2x.png","/Users/dean/PycharmProjects/CodeRepository/x.png")
"""
# 4.文件或文件夹重命名
"""
shutil.move("/Users/dean/PycharmProjects/CodeRepository/x.png","/Users/dean/PycharmProjects/CodeRepository/xxxx.png")
shutil.move("/Users/dean/PycharmProjects/CodeRepository/files","/Users/dean/PycharmProjects/CodeRepository/images")
"""
# 5. 压缩文件
"""
# base_name,压缩后的压缩包文件
# format,压缩的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar".
# root_dir,要压缩的文件夹路径
"""
# shutil.make_archive(base_name=r\'datafile\',format=\'zip\',root_dir=r\'files\')
# 6. 解压文件
"""
# filename,要解压的压缩包文件
# extract_dir,解压的路径
# format,压缩文件格式
"""
# shutil.unpack_archive(filename=r\'datafile.zip\', extract_dir=r\'xxxxxx/xo\', format=\'zip\')
3、 sys
import sys
# 1. 获取解释器版本
"""
print(sys.version)
print(sys.version_info)
print(sys.version_info.major, sys.version_info.minor, sys.version_info.micro)
"""
# 2. 导入模块路径
"""
print(sys.path)
"""
- argv,执行脚本时,python解释器后面传入的参数
import sys
print(sys.argv)
# [
# \'/Users/dean/PycharmProjects/mkcourse/day14/2.接受执行脚本的参数.py\'
# ]
# [
# "2.接受执行脚本的参数.py"
# ]
# [\'2.接受执行脚本的参数.py\', \'127\', \'999\', \'666\', \'dean\']
# 例如,请实现下载图片的一个工具。
def download_image(url):
print("下载图片", url)
def run():
# 接受用户传入的参数
url_list = sys.argv[1:]
for url in url_list:
download_image(url)
if __name__ == \'__main__\':
run()
4、 random
import random
# 1. 获取范围内的随机整数
v = random.randint(10, 20)
print(v)
# 2. 获取范围内的随机小数
v = random.uniform(1, 10)
print(v)
# 3. 随机抽取一个元素
v = random.choice([11, 22, 33, 44, 55])
print(v)
# 4. 随机抽取多个元素
v = random.sample([11, 22, 33, 44, 55], 3)
print(v)
# 5. 打乱顺序
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(data)
print(data)
5、 hashlib
import hashlib
hash_object = hashlib.md5()
hash_object.update("dean".encode(\'utf-8\'))
result = hash_object.hexdigest()
print(result)
import hashlib
hash_object = hashlib.md5("iajfsdunjaksdjfasdfasdf".encode(\'utf-8\'))
hash_object.update("dean".encode(\'utf-8\'))
result = hash_object.hexdigest()
print(result)
6、 json
json模块,是python内部的一个模块,可以将python的数据格式 转换为json格式的数据,也可以将json格式的数据转换为python的数据格式。
json格式,是一个数据格式(本质上就是个字符串,常用语网络数据传输)
# Python中的数据类型的格式
data = [
{"id": 1, "name": "dean", "age": 18},
{"id": 2, "name": "sam", "age": 18},
(\'dean\',123),
]
# JSON格式
value = \'[{"id": 1, "name": "dean", "age": 18}, {"id": 2, "name": "sam", "age": 18},["dean",123]]\'
6.1 核心功能
json格式的作用
跨语言数据传输,例如:
A系统用Python开发,有列表类型和字典类型等。
B系统用Java开发,有数组、map等的类型。
语言不同,基础数据类型格式都不同。
为了方便数据传输,大家约定一个格式:json格式,每种语言都是将自己数据类型转换为json格式,也可以将json格式的数据转换为自己的数据类型。
Python数据类型与json格式的相互转换:
-
数据类型 -> json ,一般称为:序列化
import json data = [ {"id": 1, "name": "dean", "age": 18}, {"id": 2, "name": "sam", "age": 18}, ] res = json.dumps(data) print(res) # \'[{"id": 1, "name": "\u6b66\u6c9b\u9f50", "age": 18}, {"id": 2, "name": "sam", "age": 18}]\' res = json.dumps(data, ensure_ascii=False) print(res) # \'[{"id": 1, "name": "dean", "age": 18}, {"id": 2, "name": "sam", "age": 18}]\' -
json格式 -> 数据类型,一般称为:反序列化
import json data_string = \'[{"id": 1, "name": "dean", "age": 18}, {"id": 2, "name": "sam", "age": 18}]\' data_list = json.loads(data_string) print(data_list)
6.2 类型要求
python的数据类型转换为 json 格式,对数据类型是有要求的,默认只支持:
+-------------------+---------------+
| Python | JSON |
+===================+===============+
| dict | object |
+-------------------+---------------+
| list, tuple | array |
+-------------------+---------------+
| str | string |
+-------------------+---------------+
| int, float | number |
+-------------------+---------------+
| True | true |
+-------------------+---------------+
| False | false |
+-------------------+---------------+
| None | null |
+-------------------+---------------+
data = [
{"id": 1, "name": "dean", "age": 18},
{"id": 2, "name": "sam", "age": 18},
]
其他类型如果想要支持,需要自定义JSONEncoder 才能实现,例如:
import json
from decimal import Decimal
from datetime import datetime
data = [
{"id": 1, "name": "dean", "age": 18, \'size\': Decimal("18.99"), \'ctime\': datetime.now()},
{"id": 2, "name": "sam", "age": 18, \'size\': Decimal("9.99"), \'ctime\': datetime.now()},
]
class MyJSONEncoder(json.JSONEncoder):
def default(self, o):
if type(o) == Decimal:
return str(o)
elif type(o) == datetime:
return o.strftime("%Y-%M-%d")
return super().default(o)
res = json.dumps(data, cls=MyJSONEncoder)
print(res)
6.3 其他功能
json模块中常用的是:
-
json.dumps,序列化生成一个字符串。 -
json.loads,发序列化生成python数据类型。 -
json.dump,将数据序列化并写入文件(不常用)import json data = [ {"id": 1, "name": "dean", "age": 18}, {"id": 2, "name": "sam", "age": 18}, ] file_object = open(\'xxx.json\', mode=\'w\', encoding=\'utf-8\') json.dump(data, file_object) file_object.close() -
json.load,读取文件中的数据并反序列化为python的数据类型(不常用)import json file_object = open(\'xxx.json\', mode=\'r\', encoding=\'utf-8\') data = json.load(file_object) print(data) file_object.close()
7、 时间处理
-
UTC/GMT:世界时间
-
本地时间:本地时区的时间。
Python中关于时间处理的模块有两个,分别是time和datetime。
7.1 time
import time
# 获取当前时间戳(自1970-1-1 00:00)
v1 = time.time()
print(v1)
# 时区
v2 = time.timezone
# 停止n秒,再执行后续的代码。
time.sleep(5)
7.2 datetime
在平时开发过程中的时间一般是以为如下三种格式存在:
-
datetime
from datetime import datetime, timezone, timedelta v1 = datetime.now() # 当前本地时间 print(v1) tz = timezone(timedelta(hours=7)) # 当前东7区时间 v2 = datetime.now(tz) print(v2) v3 = datetime.utcnow() # 当前UTC时间 print(v3)from datetime import datetime, timedelta v1 = datetime.now() print(v1) # 时间的加减 v2 = v1 + timedelta(days=140, minutes=5) print(v2) # datetime类型 + timedelta类型from datetime import datetime, timezone, timedelta v1 = datetime.now() print(v1) v2 = datetime.utcnow() # 当前UTC时间 print(v2) # datetime之间相减,计算间隔时间(不能相加) data = v1 - v2 print(data.days, data.seconds / 60 / 60, data.microseconds) # datetime类型 - datetime类型 # datetime类型 比较 datetime类型 -
字符串
# 字符串格式的时间 ---> 转换为datetime格式时间 text = "2021-11-11" v1 = datetime.strptime(text,\'%Y-%m-%d\') # %Y 年,%m,月份,%d,天。 print(v1)# datetime格式 ----> 转换为字符串格式 v1 = datetime.now() val = v1.strftime("%Y-%m-%d %H:%M:%S") print(val) -
时间戳
# 时间戳格式 --> 转换为datetime格式 ctime = time.time() # 11213245345.123 v1 = datetime.fromtimestamp(ctime) print(v1)# datetime格式 ---> 转换为时间戳格式 v1 = datetime.now() val = v1.timestamp() print(val)
示例
-
日志记录,将用户输入的信息写入到文件,文件名格式为
年-月-日-时-分.txt。from datetime import datetime while True: text = input("请输入内容:") if text.upper() == "Q": break current_datetime = datetime.now().strftime("%Y-%m-%d-%H-%M") file_name = "{}.txt".format(current_datetime) with open(file_name, mode=\'a\', encoding=\'utf-8\') as file_object: file_object.write(text) file_object.flush() -
用户注册,将用户信息写入Excel,其中包含:用户名、密码、注册时间 三列。
import os import hashlib from datetime import datetime from openpyxl import load_workbook from openpyxl import workbook BASE_DIR = os.path.dirname(os.path.abspath(__file__)) FILE_NAME = "db.xlsx" def md5(origin): hash_object = hashlib.md5("sdfsdfsdfsd23sd".encode(\'utf-8\')) hash_object.update(origin.encode(\'utf-8\')) return hash_object.hexdigest() def register(username, password): db_file_path = os.path.join(BASE_DIR, FILE_NAME) if os.path.exists(db_file_path): wb = load_workbook(db_file_path) sheet = wb.worksheets[0] next_row_position = sheet.max_row + 1 else: wb = workbook.Workbook() sheet = wb.worksheets[0] next_row_position = 1 user = sheet.cell(next_row_position, 1) user.value = username pwd = sheet.cell(next_row_position, 2) pwd.value = md5(password) ctime = sheet.cell(next_row_position, 3) ctime.value = datetime.now().strftime("%Y-%m-%d %H:%M:%S") wb.save(db_file_path) def run(): while True: username = input("请输入用户名:") if username.upper() == "Q": break password = input("请输入密码:") register(username, password) if __name__ == \'__main__\': run()
8、 正则
当给你一大堆文本信息,让你提取其中的指定数据时,可以使用正则来实现。例如:提取文本中的邮箱和手机号
import re
text = "楼主太牛逼了,在线想要 66666666@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789"
phone_list = re.findall("1[3|5|8|9]\d{9}", text)
print(phone_list)
8.1 正则表达式
1. 字符相关
-
dean匹配文本中的deanimport re text = "你好dean,阿斯顿发wupeiqasd 阿士大夫能接受的deanff" data_list = re.findall("dean", text) print(data_list) # [\'dean\', \'dean\'] 可用于计算字符串中某个字符出现的次数 -
[abc]匹配a或b或c 字符。import re text = "你2b好dean,阿斯顿发awupeiqasd 阿士大夫a能接受的wffbbupqaceiqiff" data_list = re.findall("[abc]", text) print(data_list) # [\'b\', \'a\', \'a\', \'a\', \'b\', \'b\', \'c\']import re text = "你2b好dean,阿斯顿发awupeiqasd 阿士大夫a能接受的wffbbupqcceiqiff" data_list = re.findall("q[abc]", text) print(data_list) # [\'qa\', \'qc\'] -
[^abc]匹配除了abc意外的其他字符。import re text = "你wffbbupceiqiff" data_list = re.findall("[^abc]", text) print(data_list) # [\'你\', \'w\', \'f\', \'f\', \'u\', \'p\', \'e\', \'i\', \'q\', \'i\', \'f\', \'f\'] -
[a-z]匹配a~z的任意字符( [0-9]也可以 )。import re text = "samrootrootadmin" data_list = re.findall("t[a-z]", text) print(data_list) # [\'tr\', \'ta\'] -
.代指除换行符以外的任意字符。import re text = "samraotrootadmin" data_list = re.findall("r.o", text) print(data_list) # [\'rao\', \'roo\']import re text = "samraotrootadmin" data_list = re.findall("r.+o", text) # 贪婪匹配 print(data_list) # [\'raotroo\']import re text = "samraotrootadmin" data_list = re.findall("r.+?o", text) # 非贪婪匹配 print(data_list) # [\'rao\'] -
\w代指字母或数字或下划线(汉字)。import re text = "北京大郎sam天北 京大郎sam天" data_list = re.findall("大\w+x", text) print(data_list) # [\'大郎sam\', \'大郎sam\'] -
\d代指数字import re text = "root-ad32min-add3-admd1in" data_list = re.findall("d\d", text) print(data_list) # [\'d3\', \'d3\', \'d1\']import re text = "root-ad32min-add3-admd1in" data_list = re.findall("d\d+", text) print(data_list) # [\'d32\', \'d3\', \'d1\'] -
\s代指任意的空白符,包括空格、制表符等。import re text = "root admin add admin" data_list = re.findall("a\w+\s\w+", text) print(data_list) # [\'admin add\']
2. 数量相关
-
*重复0次或更多次import re text = "他是大B个,确实是个大2B。" data_list = re.findall("大2*B", text) print(data_list) # [\'大B\', \'大2B\'] -
+重复1次或更多次import re text = "他是大B个,确实是个大2B,大3B,大66666B。" data_list = re.findall("大\d+B", text) print(data_list) # [\'大2B\', \'大3B\', \'大66666B\'] -
?重复0次或1次import re text = "他是大B个,确实是个大2B,大3B,大66666B。" data_list = re.findall("大\d?B", text) print(data_list) # [\'大B\', \'大2B\', \'大3B\'] -
{n}重复n次import re text = "楼主太牛逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" data_list = re.findall("151312\d{5}", text) print(data_list) # [\'15131255789\'] -
{n,}重复n次或更多次import re text = "楼主太牛逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" data_list = re.findall("\d{9,}", text) print(data_list) # [\'492650169\', \'15131255789\'] -
{n,m}重复n到m次import re text = "楼主太牛逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" data_list = re.findall("\d{10,15}", text) print(data_list) # [\'15131255789\']
3. 括号(分组)
-
提取数据区域
import re text = "楼主太牛逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" data_list = re.findall("15131(2\d{5})", text) print(data_list) # [\'255789\']import re text = "楼主太牛逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来15131266666呀" data_list = re.findall("15(13)1(2\d{5})", text) print(data_list) # [ (\'13\', \'255789\') ]import re text = "楼主太牛逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" data_list = re.findall("(15131(2\d{5}))", text) print(data_list) # [(\'15131255789\', \'255789\')] -
获取指定区域 + 或条件
import re text = "楼主15131root太牛15131sam逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" data_list = re.findall("15131(2\d{5}|r\w+太)", text) print(data_list) # [\'root太\', \'255789\']import re text = "楼主15131root太牛15131sam逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" data_list = re.findall("(15131(2\d{5}|r\w+太))", text) print(data_list) # [(\'15131root太\', \'root太\'), (\'15131255789\', \'255789\')]示例
-
利用正则匹配QQ号码
[1-9]\d{4,} -
身份证号码
import re text = "dsf130429191912015219k13042919591219521Xkk" data_list = re.findall("\d{17}[\dX]", text) # [abc] print(data_list) # [\'130429191912015219\', \'13042919591219521X\']import re text = "dsf130429191912015219k13042919591219521Xkk" data_list = re.findall("\d{17}(\d|X)", text) print(data_list) # [\'9\', \'X\']import re text = "dsf130429191912015219k13042919591219521Xkk" data_list = re.findall("(\d{17}(\d|X))", text) print(data_list) # [(\'130429191912015219\', \'9\'), (\'13042919591219521X\', \'X\')]import re text = "dsf130429191912015219k13042919591219521Xkk" data_list = re.findall("(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)", text) print(data_list) # [(\'130429\', \'1919\', \'12\', \'01\', \'521\', \'9\'), (\'130429\', \'1959\', \'12\', \'19\', \'521\', \'X\')] -
手机号
import re text = "我的手机哈是15133377892,你的手机号是1171123啊?" data_list = re.findall("1[3-9]\d{9}", text) print(data_list) # [\'15133377892\'] -
邮箱地址
import re text = "楼主太牛逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" email_list = re.findall("\w+@\w+\.\w+",text) print(email_list) # [\'492650169@qq.com和xxxxx\']import re text = "楼主太牛逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" email_list = re.findall("[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+", text, re.ASCII) print(email_list) # [\'492650169@qq.com\', \'xxxxx@live.com\']import re text = "楼主太牛逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" email_list = re.findall("\w+@\w+\.\w+", text, re.ASCII) print(email_list) # [\'492650169@qq.com\', \'xxxxx@live.com\']import re text = "楼主太牛44266-2578@qq.com逼了,在线想要 492650169@qq.com和xxxxx@live.com谢谢楼主,手机号也可15131255789,搞起来呀" email_list = re.findall("(\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)", text, re.ASCII) print(email_list) # [(\'44266-2578@qq.com\', \'-2578\', \'\', \'\'), (\'xxxxx@live.com\', \'\', \'\', \'\')] -
补充代码,实现获取页面上的所有评论(已实现),并提取里面的邮箱。
# 先安装两个模块 pip3 install requests pip3 install beautifulsoup4import re import requests from bs4 import BeautifulSoup res = requests.get( url="https://www.douban.com/group/topic/79870081/", headers={ \'User-Agent\': \'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36\', } ) bs_object = BeautifulSoup(res.text, "html.parser") comment_object_list = bs_object.find_all("p", attrs={"class": "reply-content"}) for comment_object in comment_object_list: text = comment_object.text print(text) # 请继续补充代码,提取text中的邮箱地址
4. 起始和结束
上述示例中都是去一段文本中提取数据,只要文本中存在即可。
但,如果要求用户输入的内容必须是指定的内容开头和结尾,比就需要用到如下两个字符。
-
^开始 -
$结束
import re
text = "啊492650169@qq.com我靠"
email_list = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
print(email_list) # []
import re
text = "492650169@qq.com"
email_list = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
print(email_list) # [\'492650169@qq.com\']
这种一般用于对用户输入数据格式的校验比较多,例如:
import re
text = input("请输入邮箱:")
email = re.findall("^\w+@\w+.\w+$", text, re.ASCII)
if not email:
print("邮箱格式错误")
else:
print(email)
5. 特殊字符
由于正则表达式中 * . \ { } ( ) 等都具有特殊的含义,所以如果想要在正则中匹配这种指定的字符,需要转义,例如:
import re
text = "我是你{5}爸爸"
data = re.findall("你{5}爸", text)
print(data) # []
import re
text = "我是你{5}爸爸"
data = re.findall("你\{5\}爸", text)
print(data)
8.2 re模块
python中提供了re模块,可以处理正则表达式并对文本进行处理。
-
findall,获取匹配到的所有数据
import re text = "dsf130429191912015219k13042919591219521Xkk" data_list = re.findall("(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)", text) print(data_list) # [(\'130429\', \'1919\', \'12\', \'01\', \'521\', \'9\'), (\'130429\', \'1959\', \'12\', \'19\', \'521\', \'X\')] -
match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
import re text = "大小逗2B最逗3B欢乐" data = re.match("逗\dB", text) print(data) # Noneimport re text = "逗2B最逗3B欢乐" data = re.match("逗\dB", text) if data: content = data.group() # "逗2B" print(content) -
search,浏览整个字符串去匹配第一个,未匹配成功返回None
import re text = "大小逗2B最逗3B欢乐" data = re.search("逗\dB", text) if data: print(data.group()) # "逗2B" -
sub,替换匹配成功的位置
import re text = "逗2B最逗3B欢乐" data = re.sub("\dB", "沙雕", text) print(data) # 逗沙雕最逗沙雕欢乐import re text = "逗2B最逗3B欢乐" data = re.sub("\dB", "沙雕", text, 1) print(data) # 逗沙雕最逗3B欢乐 -
split,根据匹配成功的位置分割
import re text = "逗2B最逗3B欢乐" data = re.split("\dB", text) print(data) # [\'逗\', \'最逗\', \'欢乐\']import re text = "逗2B最逗3B欢乐" data = re.split("\dB", text, 1) print(data) # [\'逗\', \'最逗3B欢乐\'] -
finditer
import re text = "逗2B最逗3B欢乐" data = re.finditer("\dB", text) for item in data: print(item.group())import re text = "逗2B最逗3B欢乐" data = re.finditer("(?P<xx>\dB)", text) # 命名分组 for item in data: print(item.groupdict())text = "dsf130429191912015219k13042919591219521Xkk" data_list = re.finditer("\d{6}(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})\d{3}[\d|X]", text) for item in data_list: info_dict = item.groupdict() print(info_dict)