正则表达式

什么是正则表达式? 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑

所以正则表达式并非某一编程语言所特有,它在不同的环境下有不同的用法。比如说shell脚本的awk命令或者是#、%分割字符等等,但是不管哪种方法,正则表达式都为我们解决文本匹配问题提供了巨大的帮助。

而应用到爬虫里,当我们获取了目标网页的html之后,往往需要批量地匹配目标字符串,这些字符串或许是网址,或许是网页的关键信息,但是指望人工手动地去复制粘帖是不现实的,因此就需要正则表达式去匹配和输出。

文章目录

  • 正则表达式
    • 转义字符、限定符、特殊字符
    • re.match
    • re.search
    • re.findall
    • re.sub
    • re.compile
    • 实例演示

下面实例均为python脚本

转义字符、限定符、特殊字符

\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\s 匹配任意空白字符,等价于[\t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意数字,等价于[0-9]
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结束
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符串的末尾
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
[…] 用来表示一组字符,单独列出:[amk]匹配"a","m"或"k"
[^…] 不在[]中的字符:[^abc]匹配除了a,b,c之外的字符
* 匹配0个或多个的表达式
+ 匹配1个或多个的表达式
? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配n个前面表达式
{n,m} 匹配n到m次由前面的正则表达式定义的片段,贪婪方式
a|b 匹配a或b
() 匹配括号内的表达式,也表示一个组

re.match

总是会从第一个字符开始匹配

import re
content = "Hello 123 4567 World_This is a Regex Demo"
result = re.match("^Hello\s\d{3}\s\d{4}\s\w{10}.*Demo$",content)
#参照上表,'^'匹配开头,'$'匹配结尾
#接受三个参数,正则表达式、目标字符串、匹配模式(可选)
print(len(content))
print(result)  ##打印结果,为对象
print(result.group())  #返回匹配结果,若有多个结果,使用索引获取
print(result.span()) #返回匹配长度

输出

41
<re.Match object; span=(0, 41), match='Hello 123 4567 World_This is a Regex Demo'>
Hello 123 4567 World_This is a Regex Demo
(0, 41)

泛匹配

result = re.match("^Hello.*Demo$",content)
#与上例匹配结果相同
#这里使用'.*'来匹配'Hello'和'Demo'中的所有内容

目标匹配

import re
content = "Hello 1234567 World_This is a Regex Demo"
result = re.match("^Hello\s(\d+)\s\w.*Demo$",content)
#指定端点,左边\s,右边\s
print(result.group())
print(result.group(1))
#若表达式里存在括号,则可以给group传递参数来提取第n个括号内的内容,
#括号也可以指定为一个整体进行操作

输出

Hello 1234567 World_This is a Regex Demo
1234567

贪婪匹配与非贪婪匹配

import re
content = "Hello 1234567 World_This is a Regex Demo"
result = re.match("^He.*(\d+).*Demo$",content)
#贪婪匹配,'.*'匹配尽可能多的字符,因此(\d+)实际上只匹配到了1个数字
print(result.group())
print(result.group(1))
result1 = re.match("^He.*?(\d+).*Demo$",content)
#'?'指定非贪婪匹配,匹配尽可能少的字符,指有或者没有
print(result1.group())
print(result1.group(1))

输出

Hello 1234567 World_This is a Regex Demo
7
Hello 1234567 World_This is a Regex Demo
1234567

匹配模式

import re
content = '''Hello 1234567 World_This \n is a Regex Demo'''
result = re.match("^He.*?(\d+).*?Demo$",content)
result1 = re.match("^He.*?(\d+).*?Demo$",content,re.S)
#由于content中存在换行符,'\'正常情况下无法匹配,返回None
#指定匹配模式(re.S)后,'\'就可以匹配任意包括换行符的字符
print(result)
print(result1)

输出

None
<_sre.SRE_Match object; span=(0, 41), match='Hello 1234567 World_This \nis a Regex Demo'>

转义

import re
content = "price is $5.00"
#如果目标字符串中存在上表中的特殊字符串,则需要转义符'\'来进行特殊处理
result = re.match("price is \$5\.00", content)
#特殊字符采用换行符'\'
print(result.group())

输出

price is $5.00

re.match方法有一个缺陷,就是它只能够从第一个字符开始匹配,如果我们所提供的正则表达式和目标字符串的第一个字符不同,则匹配结果会返回None

比如

import re
content = "price is $5.00"
result = re.match("rice is \$5\.00", content)
#此时第一个字符不同
print(result)

输出

None

re.search

而re.search就是解决这个问题的方法

它会扫描整个字符串,返回第一个成功匹配的字符串

import re
content = "Extra stings Hello 1234567 World_This is a Regex Demo Extra stings"
result = re.match("Hello.*?(\d+).*?Demo",content) #第一个字符不匹配,返回None
result1 = re.search("Hello.*?(\d+).*?Demo",content)
print(result)
print(result1)

输出

None
<_sre.SRE_Match object; span=(13, 53), match='Hello 1234567 World_This is a Regex Demo'>

re.findall

原理类似,扫描整个字符串,返回符合条件的所有结果,返回结果可以用索引访问

re.sub

替换字符串中每一个匹配的子串后返回替换后的字符串

import re
content = "Extra stings Hello 1234567 World_This is a Regex Demo Extra stings"
result = re.sub("\d+","Re",content) #替换数字为'Re'
print(result)

输出

Extra stings Hello Re World_This is a Regex Demo Extra stings

或者想要在指定字符串后添加新的元素

import re
content = "Extra stings Hello 1234567 World_This is a Regex Demo Extra stings"
result = re.sub("(\d+)", r"\1 8910",content)
#‘\1’ 代表取所要替换的字符的第一个组合,r代表使其成为原生字符,
#r"\1 8910"替换为"\\1 8910"效果相同
print(result)

输出

Extra stings Hello 1234567 8910 World_This is a Regex Demo Extra stings

re.compile

将正则字符串编译成正则表达式对象,以便复用

import re
content = '''Hello 1234567 World_This
is a Regex Demo'''
pattern = re.compile("Hello.*Demo",re.S)
result = re.match(pattern,content)
print(result.group())

输出

Hello 1234567 World_This
is a Regex Demo

实例演示

import re
import requests
content = requests.get("https://book.douban.com/").text
pattern = re.compile('<div class="title">.*?href="(.*?)".*?title="(.*?)"',re.S)
results = re.findall(pattern,content)
for result in results:url,name = resultprint(url,name) #运行时间较长
https://book.douban.com/subject/34778578/?icn=index-latestbook-subject 恐妻家
https://book.douban.com/subject/30432492/?icn=index-latestbook-subject 旅行
https://book.douban.com/subject/34454619/?icn=index-latestbook-subject 遗忘,刑警
https://book.douban.com/subject/30264052/?icn=index-latestbook-subject 西方通史:从古代源头到20世纪
https://book.douban.com/subject/33420970/?icn=index-latestbook-subject 绕日飞行
https://book.douban.com/subject/30420913/?icn=index-latestbook-subject 美国官僚体制
https://book.douban.com/subject/30435811/?icn=index-latestbook-subject 没有男人的公寓
https://book.douban.com/subject/34442426/?icn=index-latestbook-subject 纳粹猎人

输出影评网址和电影名

最近学校的事情有点多、、更新应该不会很频繁,另外,ig、fpx冲冲冲!

python网络爬虫笔记-re正则表达式相关推荐

  1. Python 网络爬虫笔记6 -- 正则表达式

    Python 网络爬虫笔记6 – 正则表达式 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Python网 ...

  2. Python 网络爬虫笔记11 -- Scrapy 实战

    Python 网络爬虫笔记11 – Scrapy 实战 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...

  3. Python 网络爬虫笔记10 -- Scrapy 使用入门

    Python 网络爬虫笔记10 – Scrapy 使用入门 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接: ...

  4. Python 网络爬虫笔记9 -- Scrapy爬虫框架

    Python 网络爬虫笔记9 – Scrapy爬虫框架 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Py ...

  5. Python 网络爬虫笔记8 -- 股票数据定向爬虫

    Python 网络爬虫笔记8 – 股票数据定向爬虫 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Pyth ...

  6. Python 网络爬虫笔记5 -- Beautiful Soup库实战

    Python 网络爬虫笔记5 – Beautiful Soup库实战 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. ...

  7. Python 网络爬虫笔记4 -- 信息标记与提取

    Python 网络爬虫笔记4 – 信息标记与提取 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Pytho ...

  8. Python 网络爬虫笔记3 -- Beautiful Soup库

    Python 网络爬虫笔记3 – Beautiful Soup库 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程 ...

  9. Python 网络爬虫笔记2 -- Requests库实战

    Python 网络爬虫笔记2 – Requests库实战 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:P ...

  10. Python 网络爬虫笔记1 -- Requests库

    Python 网络爬虫笔记1 – Requests库 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Pyt ...

最新文章

  1. AgileEAS.NET平台开发指南-实现插件
  2. .NET Core 3.0 Preview 9 发布
  3. 【Android】获取控件的宽和高
  4. Nginx配置指定媒体类型文件强制下载
  5. 2018-2019-1 20165203 《信息安全系统设计基础》第六周学习总结
  6. leetcode 852. 山脉数组的峰顶索引(二分查找)
  7. 反序列化的时候出现eof exception_FastJson序列化时候出现了$ref?还不赶紧学习下...
  8. 玩转Eclipse--如何使用eclipse可以更好的提高我们的工作效率
  9. 因讨要介绍费引发纠纷 浙江龙湾一男子砍死房产中介
  10. RBAC-基于角色的权限管理
  11. python实例 输出你好
  12. 高校计算机成绩管理系统开题报告,高校科研管理系统_高校科研管理系统开题报告...
  13. 什么是蜂窝网络和蜂窝设备测试
  14. 矩阵的行简化阶梯型和标准型
  15. Spring中常用注解及其作用(二)
  16. Java10-I/O
  17. 【暴强】200种好口碑便宜护肤品 - 健康程序员,至尚生活!
  18. RxJava操作符(四)Combining
  19. c++filt解码已损坏的函数名称
  20. 基于MATLAB人脸面部检测的口罩识别系统

热门文章

  1. linux基础学习思维导图及文档(17万字)
  2. 计算机病毒教学评课,计算机病毒评课稿样稿.doc
  3. PNP型三极管s9012驱动共阳极数码管
  4. NVIDIA GPU简史、命名规则及基础知识
  5. python课设参考文献_Python课程设计任务书
  6. 『HarmonyOS』万物互联,分布式操作系统
  7. 异步赠书:10月Python畅销书升级
  8. MASM32编写TcpStatC再进阶 显示PID和对应进程说明符
  9. masm32踩坑总结
  10. GetStyle,ModifyStyle,GetExStyle,ModifyStyleEx