2.1正则(re)模块
正则在Python中应用非常广泛,如:特定字符串的查找、切割与替换等, 特定格式(邮箱、手机号、IP、URL)的校验,爬虫提取特定内容,所以在爬虫中, 正则还是比较重要的,它会帮你提取到你需要的信息。
使用原则
正则效率比较低,会较低代码可读性, 所以字符串函数可以解决的问题就不要使用正则。
世界上最难以理解的三样东西:道士神符、医生处方、码农正则。
不清楚功能不要去阅读别人的正则,正则是用来写的,不是读的。
说明:我们需要解析正则,只是使用,所以需要借助’re’模块
(1)正则相关函数:
match:从开头进行匹配,匹配到返回结果,没有返回None
search:任意位置匹配,功能和match一样,都是单次的,找到就会停止
findall:匹配全部,返回所有匹配的结果列表,没有返回空列表
compile:创建正则表达式对象,让匹配内容和对象分开操作
例子(不创建正则对象):
import re
m = re.search('abc', 'hadajabcadjlae')
if m:
#返回匹配的内容
print(m.group())
#返回匹配内容的位置
print(m.span())
例子(创建正则对象):
import re
c = re.compile('cba')
# 从开头匹配
#m = c.match('cbasdhaj; acbaalsdk')
#从任意位置匹配
m = c.search('casdhaj; acbaalsdk')
if m:
print(m.group())
(1)匹配单个字符
普通字符:就是一对一的完全匹配
[]表示中间的任一字符
如:[abcde]表示abcde的任一字符
\d表示数字字符,和[0-9]等价
\D表示非数字字符,和[^0-9]等价
\s表示空白字符(\n、\r、\t、空格)
\S表示非空白字符(\s相反的内容)
\b表示词边界(开头、结尾、空格、标点)
\B表示非词边界(\b相反的内容)
\w表示匹配字(数字、字母、下划线)
\W表示匹配非字(\w相反的内容)
.表示除了’\n’以外的任意字符
(2)次数限定
说明:为了修饰前面的单个字符出现的次数
- :至少一次
? :至多一次
{m}:指定m次
{m,n}:m <= 次数 <=n
{m,}:至少m次
{,m}:至多m次
- :任意次
(3)边界限定
^:以指定的内容开头
$:以指定的内容结尾
(4)优先级与整体
|:表示或,拥有最低的优先级
():可以表示一个整体
(5)findall的特殊之处
说明: 按照正则进行匹配,但是添加()后,结果只显示()匹配的内容
例子3:
f = re.findall('A(abc)A', 'asdjAabcAasdjAabcAsdkabca')
print(f)
(6)贪婪匹配
贪婪:最大限度的匹配。 正则的匹配默认是贪婪的
非贪婪:只要满足条件,能少匹配就少匹配。 可以使用’? '取消贪婪
.+? :取消至少一次的贪婪匹配
.*? :取消任意多次的贪婪匹配
简单来说就是能少匹配就少匹配内容
(7)字符转义
说明:匹配凡是跟正则语法相关的字符都需要进转义, 通常在字符串前加r或在字符前加,推荐使用第一种
(8)正则切割
和字符串切割一样使用split函数
例子:
import re
c = re.compile(r'\d')
string = '正则其实不难1但是学完之后2发现什么也不出来3是这样吧'
#字符串是固定切割,不能解决某类的匹配切割问题
#print(string.split('1'))
# 按照正则进行切割
#1.创建表达式
ret = c.split(string)
print(ret)
#2.不创建表达式
print(re.split(r'\d', string))
(9)正则替换
使用sub函数
例子:
import re
s = 'how1are2you'
#正则替换,以空格替换数字
s2 = re.sub(r'\d', ' ', s)
print(s2)
总结
正则是用来写的,所以千万不要硬读别人的正则。 正则在爬虫中会经常用到,所以学好正则对爬虫很关键。 当然,正则还有其他的应用和用法,但是爬虫基本上能用的就这些了, 其他的如果有兴趣可以从网上搜一下,有很多关于Python正则的介绍呢!