最近准备做个小型搜索引擎,爬虫准备用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]?\d
100-199: 1\d{2}
200-249: 2[0-4]\d
250-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 re
p = 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}?
通过加?实现