python复习

来源:互联网 发布:淘宝转换微信链接 编辑:程序博客网 时间:2024/05/29 02:29

最近准备做个小型搜索引擎,爬虫准备用python写,好久没碰python,复习一下。
一.关于python解释器和编译器的问题
这个问题我也是看了几位大神的博客才弄明白的,都知道python的解释型的语言,可是他还和js那种纯的解释型语言不一样,先看一个图
这里写图片描述
python由三个主要部分组成,运行语句的解释器,将.py文件转换为.pyc文件的编译器,以及运行.pyc文件的虚拟机,是的,python的最终执行也是建立在虚拟机之上的,我们知道java是预编译型语言,也就是,源代码经编译器编译后,最终由虚拟机解释执行.class文件,C++是编译型语言,源代码经编译后直接生成机器码执行。对比之下,当运行.py文件时,python会自动创建相应的.pyc文件,之后又虚拟机执行,那既然这样那我们为什么又说python是解释型语言呢,是这样的,当运行一个python程序的时候,编译后的结果是保存在内存中的,只有当程序运行完之后,才会在将代码写入硬盘生成.pyc文件,那么下次在用该部分代码时就不用再重复上述步骤了,直接调用.pyc文件就可以了,这种运行机制,最主要体现的就是在导入模块的时候用到,试想,比如调用sklearn库,每次都重复编译,是不是特别浪费啊。
二.python基础知识
这部分我想以代码的形式比较好,需要注意的问题我都写了注释,jupyter代码复制比较麻烦,我截的图
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

三.正则表达式
1.基础
正则表达式是一组用来简洁表达一组字符串的表达式

r='p(y|yt|yth|ytho)?n'p = re.compile(r)

这里需要注意,这里的r只是表达正则规则的一个字符串,p经过编译后才是表达正则表达式的特征,许多人这个概念还不是很清楚
正则表达式常用的字符:

.                   表示任何单一字符[ ]                 字符集,给出单一字符的取值范围  [abc][^ ]                对单个字符给出排除范围    [^abc] 表示非a或b或c*                   前一个字符扩展0次或无限多次+                   前一个字符拓展1次或无限    ?                   前一个字符拓展0次或一次|                    或{m}               前一个字符重复次数为m{m,n}            前一个字符重复次数为m到n次^                  匹配字符串的开头    ^abc表示abc匹配字符串的开头$                 匹配字符串的结尾( )                分组,里面只可以用|\d              等价于[0-9]\w                单词字符,等价于[A-Za-z0-9_]

2.几个经典的小例子

^[A-Za-z]+$   26个字母组成的字符串^-?\d+$       整数形式的字符串^[1-9]\d*$    正整数形式的字符串[1-9]\d{5}    邮政编码6位\d{3}-\d{8}|\d{4}-\d{7}  国内电话号码 010-65535333

下面看一个比较复杂的,IP地址:
IP地址分为4段,每段为0-255,因为范围不是0-9的那种,对于这种,我们分开来考虑这个问题:

0-99:[1-9]?\d100-199: 1\d{2}200-249: 2[0-4]\d250-255: 25[0-5]和起来就是:([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5].){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])

对于一般的正则表达式,只要认真点,一般都能写出来,当然更加复杂的表达式,还是需要我们慢慢积累的
3.python中对正则的处理
python 中提供了re库import re
当表达式含有转义字符时:r'\dbc'前面加一个r
re库几个常用的函数:

re.search()  找到第一个位置,返回match对象re.match()   从开始位置匹配,返回match对象re.findall()  找到全部,返回match列表re.split()   将一个字符串按照正则表达式匹配结果进行分割,返回列表

例子

import rep = r'[1-9]{2}'s = re.search(p,'123ab')print(s.group(0))输出:12

另一种等价的写法

p = re.compile(r'[1-9]{2}')s = p.search('123ab')print(s.group(0))

这种编译后多次操作,更快
关于match对象
match对象是一次性的匹配结果,包含匹配的很多信息,

print(type(s),s.re,s.pos,s.endpos,s.start())结果<class '_sre.SRE_Match'> re.compile('[1-9]{2}') 0 5 0

我觉得这种要是忘了查一下就可以了,没必要死记
Re库的贪婪匹配和最小匹配

p = r'p.*n'match = re.search(p,'python')print(match.group(0))输出为:python

输出为最长子串
如果想输出最小子串:

*? +???{m,n}?

通过加?实现

原创粉丝点击