python模块之re、collections、time、datetime

一、re模块

1.取消转义
原生的正则表达式中\n有特殊含义,如果需要匹配\n就要用\n进行转义,注意一个\只能进行一个转义,如果要匹配度的字符串中有多个\那就使用多个\来转义。
在python中还可以使用另一种更简便的方法,即使用r'\n'来取消\n的转义。并且无论待匹配的字符串中有多少个\都可以直接取消转义。

image
image

2.re模块常用方法之re.findall
根据正则匹配出所有符合条件的数据,结果是列表,如果找不到会返回空列表。

import re  # 导入re模块
ret = re.findall('正则表达式', '待匹配字符串')
ret1 = re.findall('a', 'aasdfgasdfgasdf')
print(ret1)

image

3.re模块常用方法之re.search
根据正则匹配到一个就结束,如果找不到结果反回None,结果是对象,使用.group()可以打印结果,如果找不到的话打印会报错。

import re  # 导入re模块
ret = re.search('正则表达式', '待匹配字符串')
ret1 = re.search('a', 'aasdfgasdfgasdf')
print(ret1)
print(ret1.group())

image

4.re模块常用方法之re.match
根据正则从头到尾匹配,匹配的字符串内容必须在开头才能匹配上,如果找不到结果反回None,结果是对象,使用.group()可以打印结果,如果找不到的话打印会报错。

import re  # 导入re模块
ret = re.match('正则表达式', '待匹配字符串')
ret1 = re.match('ab', 'ababdfgasdfgasdf')
print(ret1)
print(ret1.group())

image

5.re模块常用方法之re.split
根据正则切割字符串,一次一次切,结果是个列表。

import re  # 导入re模块
ret = re.split('正则表达式', '待匹配字符串')
ret1 = re.split('ab', 'ababdfgaabfgasdf')
print(ret1)

image

6.re模块常用方法之re.compile
compile方法即把正则表达式编译为一个正则表达式对象,后续可以通过此对象点方法名的方式直接匹配字符串。结果就是方法名对象返回的结果。

import re  # 导入re模块
ret = re.compile('正则表达式')
ret1 = ret.方法名('字符串')

ret = re.compile('a')
ret2 = ret.findall('aasdfgasdfgasdf')
print(ret2)

image

7.re模块常用方法之re.finditer
根据正则匹配,结果返回一个迭代器。如果需要取数可以用for循环。

import re  # 导入re模块
ret = re.finditer('正则表达式', '待匹配字符串')
ret1 = re.finditer('a', 'asdfaghjqwaerty')
print([i.group() for i in ret1])

image

8.re模块常用方法之re.sub
根据正则匹配出字符串后替换,类似于字符串类型中replace内置方法的使用。

import re  # 导入re模块
ret = re.sub('正则表达式', '更新为字符', '待匹配字符串')
ret1 = re.sub('a', 'AA', 'asdfaghjqwaerty')
print(ret1)

image

9.re模块常用方法之re.subn
根据正则匹配出字符串后替换,类似于字符串类型中replace内置方法的使用。返回一个元组,后面的数字为替换的个数,如果不写默认替换全部。

import re  # 导入re模块
ret = re.subn('正则表达式', '更新为字符', '待匹配字符串', '替换个数')
ret1 = re.subn('a', 'AA', 'asdfaghjqwaerty', 2)
print(ret1)

image

10.分组优先展示
在findall方法的正则表达式中默认有括号的组匹配完后会优先展示。如果要取消优先展示可以在括号内表达式前面加一个?:
在split方法的正则表达式中默认正则表达式在切割后不保留,如果需要保留可以把正则表达式小括号。

import re  # 导入re模块
res = re.findall("^[1-9]\d{14}(\d{2}[0-9x])?$",'110105199812067023')  # 优先展示括号内
print(res)
res1 = re.findall("^[1-9]\d{14}(?:\d{2}[0-9x])?$",'110105199812067023')  # 取消优先展示括号内
print(res1)

image

import re  # 导入re模块
res = re.split("\d+",'asd12gfdsa45sdfg')
print(res)
res1 = re.split("(\d+)",'asd12gfdsa45sdfg')
print(res1)

image

11.有名分组和无名分组
无名分组:正则表达式括号内没有名字,在打印结果的时候默认从左到右的括号取值打印,也可以按索引打印
有名分组:正则表达式中括号内字符串前面加一下 ?P<名字>,在打印结果的时候可以直接用名字打印,不需要记索引值。

import re  # 导入re模块
# 无名分组,可以用索引打印分组
res = re.search('^[1-9](?P<xxx>\d{14})(\d{2}[0-9x])?$','110105199812067023')
print(res.group(1))  # 打印第一个匹配到的分组
print(res.group(2))  # # 打印第二个匹配到的分组
# 有名索引,可以按名字打印分组
res1 = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$','110105199812067023')
print(res1.group('ooo'))
print(res1.group('xxx'))

image

12.小练习
用正则爬取红牛官网的所有分公司名字、地址、邮编、电话。
网址:http://www.redbull.com.cn/about/branch

import re
# 用正则爬取红牛官网的所有分公司名字、地址、邮编、电话。
# 源代码已经存在文件: 红牛分支信息.txt,打开文件读取所有信息
with open(r'红牛分支信息.txt', 'r', encoding='utf8') as file:
	res = file.read()
# 利用正则匹配数据
name = re.findall('<h2>(.*?)</h2>', res)
addr = re.findall("<p class='mapIco'>(.*?)</p>", res)
emil = re.findall("<p class='mailIco'>(.*?)</p>", res)
phone = re.findall("<p class='telIco'>(.*?)</p>", res)
# 把数据处理一下,
ret = zip(name, addr, emil, phone)
for i in ret:
	print("""
		分公司名字:%s
		分公司地址:%s
		分公司邮编:%s
		分公司电话:%s
	""" % (i[0], i[1], i[2], i[3]))

image

二、collections模块

1.具名元组 namedtuple
from collections import namedtuple # 两种写法
namedtuple('元组名称',['元组中元素1名字','元组中元素2名字'...])
namedtuple('元组名称','元组中元素1名字,元组中元素2名字 ...')

from collections import namedtuple
point = namedtuple('坐标', ['x', 'y', 'z'])
res = point(11, 22, 33)
print(res)
print(res.z)
print(res.y)
print(res.x)

image

2.队列 queue
import queue

import queue
# 初始化队列
q = queue.Queue()
# 往队列中添加元素
q.put('111')
q.put('222')
q.put('333')
# 从队列获取元素
print(q.get())
print(q.get())
print(q.get())
print(q.get())  # 如果值没有了就会原地等待,不会报错

image

3.双端队列 deque
from collections import deque

from collections import deque
q = deque([11, 22, 33])
q.append(444)  # 默认从右边添加
q.appendleft(555)  # 从左边添加
print(q)
print(q.pop())  # 默认右边弹出
print(q.popleft())  # 左边弹出

image

4.有序字典 OrderedDict
from collections import OrderedDict
字典本身是无序的,在python中自动排序了

image

image

5.默认值字典 defaultdict

from collections import defaultdict
values = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90]
dict = defaultdict(list)
for i in values:
	if i > 60:
		dict['k1'].append(i)
	else:
		dict['k2'].append(i)
print(dict)

6.计数器 Counter
以键值对的形式返回值,元素作为k值,次数作为value值。

res = 'abcdeabcdabcaba'
# 统计res中每个字母的个数
# 用for循环
dict = {}
for i in res:
	if i not in dict:
		dict[i] = 1
	else:
		dict[i] += 1
print(dict)

# 用计数器Counter统计
from collections import Counter
ret = Counter(res)
print(ret)

image

三、time模块

时间的三种表现形式:这三种形式是可以相互转换的
1.时间戳
2.结构化时间(给计算机看的)
3.格式化时间(给人看的)

1.阻塞秒数:time.sleep(数字)
2.时间戳:time.time()
3.格式化时间:time.strftime()

import time
print(time.strftime('%y-%m-%d'))
print(time.strftime('%y-%m-%d %H:%M:%S'))
print(time.strftime('%y-%m-%d %X'))

image

4.结构化时间:time.struct_time()
用time.localtime()可以获取当前的结构化时间

image

image

四、datetime模块

1.自定义时间 datetime.date()

import datetime
# 自定义日期 datetime.date()
res = datetime.date(2021, 9, 10)
print(res)

2.获取本地时间 datetime.date.today() datetime.datetime.today()

# 获取本地日期 datetime.date.today()
# 获取本地日期时间 datetime.datetime.today()
now_date = datetime.date.today()
now_date1 = datetime.datetime.today()
print(now_date)
print(now_date1)  # 获取年份
print(now_date.year)  # 获取月份
print(now_date.month)  # 获取天
print(now_date.weekday())  # 获取星期几,按0-6
print(now_date.isoweekday())  # 获取星期几,按1-7

image

3.时间差:timedelta()
日期对象 = 日期对象 +/- timedelta对象
timedelta对象 = 日期对象 +/- 日期对象

import datetime
now_date1 = datetime.date.today()
time_tel = datetime.timedelta(days=3)
print(now_date1)
print(now_date1-time_tel)
print(now_date1+time_tel)
et = now_date1 + time_tel
print(now_date1-et)
print(et-now_date1)

image

posted @ 2021-11-25 20:21  90啊  阅读(125)  评论(0编辑  收藏  举报