Python爬虫基础-正则表达式
# 正则表达式基础
基础1:
全局匹配函数使用格式 re.compile(正则表达式).findall(源字符串)
普通字符 正常匹配
#\n 匹配换行符
\t 匹配制表符
\w 匹配字母、数字、下划线
\W 匹配除字母、数字、下划线
\d 匹配十进制数字
\D 匹配除十进制数字
\s 匹配空白字符
\S 匹配除空白字符
[ab89x] 原子表,匹配ab89x中任意一个
[^ab89x] 原子表,匹配除ab89x以外的任意一个字符
实例1:
源字符串:"aliyunedu"
正则表达式:"yu"
输出:yu
>>> import re
>>> a="aliyunedu"
>>> pat="yu"
>>> re.compile("yu").findall(a)
['yu']
...
>>> a="aliyu89787nedu"
>>> pat="\w\d\w\d\d\w"
>>> re.compile(pat).findall(a)
['u89787']
...
>>> a="aliyu89787nedu"
>>> pat="\w\d[nedu]\w"
>>> re.compile(pat).findall(a)
['87ne']
...
基础2:
. 匹配除换行外任意一个字符
^ 匹配开始位置(不在原子表中时,在原子表中表示:非)
$ 匹配结束位置
* 前一个字符出现0\1\多次
? 前一个字符出现0\1次
+ 前一个字符出现1\多次
{n} 前一个字符恰好出现n次,没有最多限制
{n,} 前一个字符至少出现n次
{n,m} 前一个字符至少出现n次,至多m次
| 模式选择符:或
() 模式单元,通俗来说就是:想提取出什么内容,就在正则中用小括号将其括起来
。。。
实例2:
源字符串:"aliyunnnji87362387aoyubaidu"
正则表达式:"ali..."
结果:aliyun
>>> a="aliyunnnji87362387aoyubaidu"
>>> pat="ali..."
>>> re.compile(pat).findall(a)
['aliyun']
.
>>> pat="^li..."
>>> re.compile(pat).findall(a)
>>> pat="^ali..."
>>> re.compile(pat).findall(a)
['aliyun']
.
>>> pat="bai..$"
>>> re.compile(pat).findall(a)
['baidu']
.
>>> pat="ali.*" #*号前的点出现多次
>>> re.compile(pat).findall(a)
['aliyunnnji87362387aoyubaidu']
# tips:默念贪婪,即默认尽可能多地进行匹配
.
>>> pat="aliyun+" #前一个字符出现1次多次
>>> re.compile(pat).findall(a)
['aliyunnn']
.
>>> pat="aliyun?"
>>> re.compile(pat).findall(a)
['aliyun']
.
>>> pat="yun{1,2}" # 前一个字符出现至少一次,最多2次
>>> re.compile(pat).findall(a)
['yunn']
.
>>> pat="^al(i..)." #关注的是()里的,^al表示能匹配,
>>> re.compile(pat).findall(a)
['iyu']
...基础3:
贪婪模式:尽可能多地匹配
懒惰模式:尽可能少地匹配,精准模式
默认贪婪模式
如果出现如下组合,则代表懒惰模式
*?
+?
实例3:
源字符串:"poytphonyhjskjsa"
正则表达式:"p.*y"
>>> a="poytphonyhjskjsa"
>>> pat="p.*y"
>>> re.compile(pat).findall(a)
['poythony'] #默认贪婪模式
.
>>> pat="p.*?y"
>>> re.compile(pat).findall(a)
['poy', 'phony'] #懒惰模式,精准匹配
...基础4:
模式修正符:在不改变正则表达式的情况下,通过模式修正符使匹配结果发生更改
re.S 让.也可以匹配多行
re.I 让匹配时忽略大小写
实例4:
a="Python"
pat="pyt"
>>> a="Python"
>>> pat="pyt"
>>> re.compile(pat).findall(a)
[] # 因为大小写不一致,所以返回空
.
>>> re.compile(pat,re.I).findall(a)
['Pyt'] # 加入模式修正符,可以匹配
.
>>> a="""我是阿里云大学
欢迎来学习
Python网络爬虫课程
"""
>>> print(a)
我是阿里云大学
欢迎来学习
Python网络爬虫课程
>>> pat="阿里.*?Python"
>>> re.compile(pat).findall(a)
[]
>>> re.compile(pat,re.S).findall(a)
['阿里云大学\n欢迎来学习\nPython'] #匹配多行,忽略换行
+++39'19"
除了正则表达式之外,还有一-些非常好用的信息筛选的工具,比如XPath表达式、Beautiful
Soup等等,当然,我们不可能也不需要都进行掌握,在此,我们讲解一下XPath表达式。
/ 逐层提取
text() 提取标签下面的文本
//标签名** 提取所有名为**的标签
//标签名[@属性='属性
Tag:
Python
爬虫
正则表达式