内容概要
- 取消转义
- python内置模块之re
- re实战之爬取红牛分公司数据
- collections模块(python其他数据类型)
- time与datetime模块
取消转义
在原生的正则表达式中取消转义推荐使用\(每个\只能取消一个字符的转义)
在python中取消转义推荐使用r'\n\a\t'(也可以使用\)
python内置模块之re模块
在python中想要使用正则表达式要借助于模块,re模块就是其中之一
import re
re.findall('正则表达式', '要匹配的文件')
print(re.findall('b', 'rain brand about')) # 结果是一个列表(有元素或空列表)
import re
re.search('正则表达式', '要匹配的文件')
print(re.search('a', 'name rain hobby').group()) # 如果没有符合的条件search会返回None,然后group会报错
# search找到第一个就会结束
import re
print(re.match('c', 'count code cool').group()) # 如果没有符合的条件match会返回None,然后group会报错
# match从头到位开始匹配(文件内容必须开头匹配上)
re模块其他方法
import re
print(re.split('[ab]', 'abc'))
# 先从a分割得到''和'bc',在对''和'bc'从b分割
import re
print(re.sub('\d', 'A', 'sss5ert3li4nj6dc7', 2))
# 类似于字符串类型的replace方法,2是替换的个数,不填默认全部替换
import re
print(re.subn('\d', 'A', 'sss5ert3li4nj6dc7', 2))
# 返回元组,并提示替换几次
import re
regexp_obj = re.compile('\d+')
res = regexp_obj.search('absd213j1hjj213jk')
res1 = regexp_obj.match('123hhkj2h1j3123')
res2 = regexp_obj.findall('1213k1j2jhj21j3123hh')
print(res, res1, res2)
import re
res = re.finditer('\d+', 'ashdklah21h23kj12jk3klj112312121kl131')
print([i.group() for i in res])
res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$', '110105199812067023')
print(res)
print(res.group())
print(res.group(1))
print(res.group(2))
无名分组
import re
# findall针对分组优先展示 无名分组
res = re.findall("^[1-9]\d{14}(\d{2}[0-9x])?$", '110105199812067023')
print(res) # ['023']
# 取消分组优先展示 无名分组
res1 = re.findall("^[1-9](?:\d{14})(?:\d{2}[0-9x])?$", '110105199812067023')
print(res1
有名分组
import re
res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$', '110105199812067023')
print(res)
print(res.group()) # 110105199812067023
print(res.group(1)) # 10105199812067 无名分组的取值方式(索引取)
print(res.group('xxx')) # 10105199812067
print(res.group('ooo')) # 023
正则实战案例
爬取红牛分公司数据
import re
with open(r'a.txt', 'r', encoding='utf8') as f: # 读取要匹配的数据
a = f.read()
title_list = re.findall('<h2>(.*?)</h2>', a) # 分公司名字
address_list = re.findall("<p class='mapIco'>(.*?)</p>", a) # 分公司地址
email_list = re.findall("<p class='mailIco'>(.*?)</p>", a) # 分公司邮箱
phone_list = re.findall("<p class='telIco'>(.*?)</p>", a) # 分公司电话
res = zip(title_list, address_list, email_list, phone_list)
for a1 in res:
print('''
公司名字: %s
公司地址: %s
公司邮箱: %s
公司电话: %s
''' % (a1[0], a1[1], a1[2], a1[3]))
collections模块
该模块内部提供了一些高阶的数据类型
1.namedtuple(具名元组)
from collections import namedtuple
...
from collections import namedtuple
a = namedtuple('坐标', 'x y z')
res = a(1, 2, 3)
for i in res:
print(i) # x=1,y=2,x=3
from collections import namedtuple
b = namedtuple('扑克', '花色 点数')
s1 = b('♠', 'A')
S2 = b('♥', 'Q')
print(s1.花色)
print(s1.点数)
2.队列
import queue
q = queue.Queue()
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())
# print(q.get()) 值没有会原地等待
3.双端队列
from collections import deque
l = deque([1, 2, 3])
l.append(4) # 从右边加值
l.appendleft(5) # 从左边加值
print(l)
print(l.pop()) # 从后面取值
print(l.popleft()) # 从前面取值
print(l)
4.有序字典
from collections import OrderedDict
dic = OrderedDict([('name', 'sss'), ('age', 18), ('hobby', 'music')])
print(dic)
dic['qqq'] = 333
print(dic)
5.默认值字典
from collections import defaultdict
l = [10, 30, 50, 70, 90, 110]
dic = defaultdict(list)
for i in l:
if i > 60:
dic['k1'].append(i)
else:
dic['k2'].append(i)
print(dic)
6.计数器
from collections import Counter
s = 'ahdahabfjkashcauia'
print(Counter(s))
time模块
时间三种表现形式
1.时间戳(秒数)
2.结构化时间(一般给机器看)
3.格式化时间(一般给人看)
三种时间是可以相互转换的
time.sleep() 原地阻塞指定的描述
time.time() 获取时间戳
格式化时间
import time
print(time.strftime('%y-%m-%d'))
print(time.strftime('%y-%m-%d %X'))
print(time.time())
print(time.gmtime(11111111111))
print(time.localtime())
datetime模块
计算某年某月某日某时某分某秒
import datetime
print(datetime.date.today())
print(datetime.datetime.today())
import datetime
a = datetime.datetime.today()
print(a.year)
print(a.month)
print(a.day)
print(a.weekday()) # 获取星期0-6天,0表示星期一
print(a.isoweekday()) # 获取星期1-7天,1表示星期一
时间差
import datetime
a = datetime.datetime.today()
b = datetime.timedelta(days=3)
print(a - b)
print(a + b)
UTC时间与我们的东八区时间差差八个小时
import datetime
print(datetime.datetime.now())
print(datetime.datetime.utcnow())