富贵和你一起复习Python(第07篇)— 正则表达式(正则必看篇)

继续复习Python,今日复习 —— 正则表达式,中间会有自己的心得体会,要是有什么错误或者补充可直接评论或者私信哟。

正则表达式

正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串的处理,可以快速、准确的完成复杂的查找、替换等处理要求。

正则表达式在网页爬虫中应用广泛,在新兴的爬虫模块出现以后,依然可以很出色的完成相应的爬虫任务,其还应用于验证登陆注册时邮箱,手机号等是否输入正确,应用起来真的非常广泛。

1. 正则表达式语法(10种代表性举例)

正则表达式由元字符及其不同的组合来构成,通过巧妙的构造正则表达式可以匹配任何字符串,并完成复杂的字符串处理任务。常用的正则表达元字符如图所示:
在这里插入图片描述
在这里插入图片描述
如果以“ \ ”开头的元字符与转义字符相同,则需要使用“ \ \ ” 或者原始字符串,在字符串前加上字符“ r ”或“ R ”。原始字符串可以减少用户的输入,主要用于正则表达式和文件路径字符串,如果字符串以一个斜线“ \ ”结束,则需要多写一个斜线,以“ \ \ ”结束。

常用的正则表达式中我感觉 . * + - | ^ $ ? \ \d \s \w () [] {} 这些元字符的用法必须得掌握,因为常用的大部分正则表达就是这几个组合使用得来的。

其中 + 和 * 都是表元字符前的东西重复,与其后的东西无关。

举几个代表性的例子:

(1)子模式后面加上 ? 表示可选。r’(https://)?(www.)?python.org’只能匹配’https://www.python.org’、‘https://python.org’、‘www.pythong.org’。

(2)’[^zbc]‘表示可以匹配任意除’a’,‘b’,'c’之外的字符。

(3)’^http’这能匹配以’http’开头的字符串。

(4)’(pattern){m,n}'允许模式重复m~n次。

(5)’^(\w){6,20}$’:匹配长度为6~20的字符串,可以包含字母,数字,下划线。

(6)’^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$’:检查给定字符串是否为合法的IP地址。

(7)’^(13[4-9]\d{8})|(15[01289]\d{8})$’:检查给定的字符串是否为合法的移动手机号码。

(8)’^\w+@(\w+.)+\w+$’:检查给定字符是否为合法电子邮件的地址。

(9)’^\d{18}|\d{15}$’:检查给定字符串是否为合法的身份证格式。

(10)’.*?’:万能正则表达式,匹配任何字符,在爬虫中非常好用。

2. re模块的主要方法

re模块主要用来实现正则表达式的操作。具体使用时,既可以直接使用re模块的方法进行字符串的处理,也可以将模式编译为正则表达式对象,然后使用正则表达式来操作对象。
在这里插入图片描述
其中,函数参数 flags 的值可以是 re.I(忽略大小写)、re.L、re.M(多行匹配模式)、re.S(使元字符“ . ”匹配任意字符,包括换行符)、re.U(匹配 Unicode 字符)、re.X(忽略模式中的空格,并可以使用 # 注释)的不同组合(使用“ | ”进行组合)。

3. 直接使用 re 模块方法

import re
s = 'alpha.beta....gamma delta'
#分割两次
re.split('[\.]',s,maxsplit = 2)
['alpha','beta','gamma delta']
#查找所有单词
re.findall(pat,s)
['alpha','beta','gamma','delta']
#字符串替换
re.sub('alpha','apple',s)
'apple.beta....gamma delta'
#字符串转义
re.escape(s)
#匹配成功
re.match('done|quite','done')

4. 使用正则表达式对象

首先使用 re 模块的 compile() 方法将正则表达式编译生成正则表达式对象,然后再使用正则表达式对象提供的方法来进行字符串处理,使用编译后的正则表达式对象可以提高字符串的处理速度,同意正则表达式也可多次重复使用。

正则表达式对象的 match(string[,pos[,endpos]]) 方法在字符串开头或指定位置进行搜索,模式必须出现在字符串的开头或指定位置; search(string[,pos[,endpos]]) 方法在整个字符串或指定范围内进行搜索; findall(string[,pos[,endpos]]) 方法在 字符串中查找所有符合正则表达式的字符串以列表的形式返回。

import re 
s = 'ShanDong Institute of Business and Technology'
#以B开头的单词 \b 表示匹配单词头或单词尾
pattern = re.compile(r'\bB\w+\b')
pattern.findall(s)
['Business']

除此之外还有 sub(repl,string[,count=0]) 和 subn(repl,string[,count=0]) 方法来实现字符串的替换功能; split(string,[,maxsplit=0]) 方法来实现字符串分割的功能。

5. 子模式与 match 对象

使用括号“ () ” 表示一个子模式,圆括号内的内容作为一个整体出现,例如“(red)+”可以匹配 redred 、redredred 等多个重复 red 的情况。

这个在python爬虫中获取你想要的内容非常实用,这是我在爬取猫眼电影排行中用到的正则爬取的方法:

def extract_information(text):
    #将正则表达式编译以可以重复使用
    pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)
    information = re.findall(pattern,text)
    return information

这个返回的内容就是你用括号括起来匹配的内容。

正则表达式模块或正则表达式对象的 match() 方法和 search() 方法匹配成功后都会返回 match() 对象。match() 对象的主要方法有:
(1) group()(返回匹配的一个或多个子模式内容)(2)groups()(返回一个包含匹配的所有子模式内容的元组)
(3) groupdict()(返回包含匹配的所有命名子模式内容的字典)
(4)start()(返回指定子模式内容的起始位置)
(5)end()(返回指定子模式内容的结束位置的前一个位置)
(6)span()(返回一个包含指定子模式内容起始位置和结束位置前一个位置的元组)

s = re.match(r'(\w+) (\w+)','Isaac Newton,physicist')
#返回整个模式内容
s.group(0)
'Issac Newton'
#返回第一个子模式内容
s.group(1)
'Issac'
#返回第二个子模式内容
s.group(2)
'Newton'
# groups()方法
s.groups()
('Isaac', 'Newton')

子模式扩展语法:
在这里插入图片描述

6. 最初自己学习正则表达式的笔记

写的有点乱哈
在这里插入图片描述
这次复习正则表达式,也是自己第一次认真看过书上的内容,对于之前在怕中时候 fiandall() 中 flag 参数有了深刻的认识,对模式也有了新的理解,总之是有收获的。加油!

猜你喜欢

转载自blog.csdn.net/zc666ying/article/details/105900109