python 爬虫:学爬虫必学的正则表达式
文章更新于:2020-03-30
一、语法格式
1、非打印字符
| 操作符 | 说明 | 实例 |
|---|---|---|
\cx |
匹配由x指明的控制字符 | \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
\f |
匹配一个换页符 | 等价于 \x0c 和 \cL |
\n |
匹配一个换行符 | 等价于 \x0a 和 \cJ |
\r |
匹配一个回车符 | 等价于 \x0d 和 \cM |
\s |
匹配任何空白字符 包括空格、制表符、换页符等等 |
等价于 [ \f\n\r\t\v] |
\S |
匹配任何非空白字符 | 等价于 [^ \f\n\r\t\v] |
\t |
匹配一个制表符 | 等价于 \x09 和 \cI |
\v |
匹配一个垂直制表符 | 等价于 \x0b 和 \cK |
2、特殊字符
| 操作符 | 说明 | 实例 |
|---|---|---|
. |
表达任何单个字符 | |
[ ] |
字符集,对单个字符给出取值范围 | [abc]表示 a、b、c,[a-z]表示 a-z单个字符 |
[^ ] |
非字符集,对单个字符给出排除范围 | [^abc]表示非a、b、c 的单个字符 |
* |
前一个字符 0 次或无限次扩展 |
abc* 表示 ab、abc、abcc、abccc 等 |
+ |
前一个字符 1 次或无限次扩展 |
abc+ 表示 abc、abcc、abccc等 |
? |
前一个字符 0 次或 1 次扩展 |
abc? 表示 ab、abc |
| |
左边表达式任意一个 | abc|def 表示 abc、def |
^ |
匹配字符串开头 | ^abc表示 abc 且在一个字符串的开头 |
$ |
匹配字符串结尾 | abc$ 表示 abc 且在一个字符串的结尾如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r' |
( ) |
分组标记,内部只能使用 | 操作符 |
(abc)表示abc,(abc|def) 表示 abc、def |
\d |
数字 | 等价于[0-9] |
\w |
单词字符 | 等价于 [A-Za-z0-9] |
\b |
匹配一个单词边界,也就是指单词和空格间的位置。 | 例如, er\b 可以匹配 never 中的 er,但不能匹配 verb 中的er。 |
\B |
匹配非单词边界。er\B 能匹配 verb 中的 er,但不能匹配 never 中的 er。 |
|
\d |
匹配一个数字字符。 | 等价于 [0-9] |
\D |
匹配一个非数字字符。 | 等价于 [^0-9] |
\f |
匹配一个换页符。 | 等价于 \x0c 和\cL |
\n |
匹配一个换行符。 | 等价于 \x0a 和 \cJ |
\r |
匹配一个回车符。 | 等价于 \x0d 和 \cM |
\s |
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v] |
|
\S |
匹配任何非空白字符。等价于 [^\f\n\r\t\v] |
|
\t |
匹配一个制表符。等价于 \x09 和 \cI |
|
\ |
匹配一个垂直制表符。 | 等价于 \x0b 和 \cK。 |
\w |
匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_] |
|
\W |
匹配任何非单词字符。等价于 [^A-Za-z0-9_] |
|
\xn |
匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41’ 匹配 “A”。’\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。. | |
\num |
匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。 |
例如,(.)\1 匹配两个连续的相同字符。 |
\n |
标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 |
|
\nm |
标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。 |
|
\nml |
如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml |
|
\un |
匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。 |
例如, \u00A9 匹配版权符号 © |
3、限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有
*或+或?或{n}或{n,}或{n,m}共6种。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 `? 就可以实现非贪婪或最小匹配。
| 操作符 | 说明 | 实例 |
|---|---|---|
{m} |
扩展前一个字符 m 次 |
ab{2}c 表示 abbc |
{m,} |
扩展前一个字符至少m次 |
ab{2,}c 表示 abbc、abbbc、abbbbc等 |
{m,n} |
扩展前一个字符 m 至 n 次(含 n) |
ab{1,3}c 表示 abc、abcc |
4、各个操作符的优先级
注:相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:
| 操作符 | 描述 |
|---|---|
\ |
转义符 |
(), (?:), (?=),[] |
圆括号和方括号 |
*,+,?,{n},{n,}, {n,m} |
限定符 |
^, $, \anymetacharacter |
位置和顺序 |
| |
“或”操作 |
5、其他说明
| 操作符 | 描述 |
|---|---|
(pattern) |
匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到。 在VBScript 中使用 SubMatches 集合, 在JScript 中则使用 $0…$9 属性。 要匹配圆括号字符,请使用 ‘(’ 或 ‘)’。 |
(?:pattern) |
匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, industr(?:y|ies) 就是一个比industry|industries 更简略的表达式。 |
(?=pattern) |
正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配。 也就是说,该匹配不需要获取供以后使用。 例如, Windows(?=95|98|NT|2000) 能匹配 Windows 2000" 中的 "Windows ,但不能匹配 Windows 3.1" 中的 "Windows。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索, 而不是从包含预查的字符之后开始。 |
(?!pattern) |
负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配。 也就是说,该匹配不需要获取供以后使用。例如 Windows (?!95|98|NT|2000) 能匹配 Windows 3.1 中的 Windows,但不能匹配 Windows 2000 中的 Windows。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
x|y |
匹配 x 或 y。例如,z|food 能匹配 z 或 food。(z|f)ood 则匹配 zood 或 food |
二、实战演练
| 语法 | 描述 |
|---|---|
^[A-Za-z]+$ |
由 26 个字母组成的字符串 |
^[A-Za-z0-9]+$ |
由 26 个字母和数字组成的字符串 |
^-?\d+$ |
整数形式的字符串 |
^[0-9]*[19][0-9]*$ |
正整数形式的字符串 |
[1-9]\d{5} |
中国境内的邮政编码,6位 |
[\u4e00-\u9fa5] |
匹配中文字符 |
\d{3}-\d{8}|\d{4|-\d{7} |
国内电话号码,010-12345678 |
三、Re库的使用
1、Re库的基本函数
| 函数 | 说明 |
|---|---|
re.search() |
在一个字符串中搜索匹配正则的第一个位置,返回 match 对象 |
re.match() |
从一个字符串的开始位置起匹配正则,返回 match 对象 |
re.findall() |
搜索字符串,以列表形式返回全部能匹配的子串 |
re.split() |
将一个字符串按正则匹配结果进行分割,返回列表类型 |
re.finditer() |
搜索字符串,饭后一个匹配结果的迭代类型,每个迭代元素是 match 对象 |
re.sub() |
在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 |
2、实战演练使用函数
语法格式 re.search(pattern, string, flags=0)
其中 flags 是正则表达式使用时的控制标记,常用的比如:
| 常用标记 | 说明 |
|---|---|
re.I re.IGNORECASE |
忽略正则表达式中的大小写,[A-Z] 能匹配到小写字符 |
re.M re.MULTILINE |
正则表达式中的^操作符能够将给定字符串的每行当做匹配开始 |
re.S re.DOTALL |
正则表达式中的.操作符能够匹配所有重复,默认匹配除换行外的所有字符 |
四、Enjoy!
注1:推荐两个正则在线练习网站
注2:英文可在线练习:Online regex tester and debugger
注3:正则表达式可视化:https://regexper.com/
python 爬虫:学爬虫必学的正则表达式的更多相关文章
- Python栈溢出【新手必学】
python3.5.4 递归函数最恶心的时候莫非栈溢出(Stack overflow).PS:另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个P ...
- 学.net必学的东西 10项【不知道我能不能学这么多,!- -,光程序编辑我都累死了】
原文发布时间为:2008-10-30 -- 来源于本人的百度文章 [由搬家工具导入] 10项.NET必学的技术2007年08月28日 星期二 14:58 1、WCF (Windows Communic ...
- Python分布式爬虫必学框架Scrapy打造搜索引擎
Python分布式爬虫必学框架Scrapy打造搜索引擎 部分课程截图: 点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/1-wHr4dTAxfd51M ...
- Python分布式爬虫必学框架Scrapy打造搜索引擎 ✌✌
Python分布式爬虫必学框架Scrapy打造搜索引擎 ✌✌ (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 第1章 课程介绍 介绍课程目标.通过课程能学习到 ...
- Python爬虫工程师必学——App数据抓取实战 ✌✌
Python爬虫工程师必学——App数据抓取实战 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统 ...
- Python爬虫工程师必学APP数据抓取实战✍✍✍
Python爬虫工程师必学APP数据抓取实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...
- Python分布式爬虫必学框架scrapy打造搜索引擎✍✍✍
Python分布式爬虫必学框架scrapy打造搜索引擎 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身 ...
- Python爬虫工程师必学——App数据抓取实战
Python爬虫工程师必学 App数据抓取实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...
- Python爬虫:学爬虫前得了解的事儿
这是关于Python的第14篇文章,主要介绍下爬虫的原理. 提到爬虫,我们就不得不说起网页,因为我们编写的爬虫实际上是针对网页进行设计的.解析网页和抓取这些数据是爬虫所做的事情. 对于大部分网页来讲, ...
- 学爬虫,需要掌握哪些Python基础?
入手爬虫确实不要求你精通Python编程,但基础知识还是不能忽视的,那么我们需要哪些Python基础呢? 首先我们先来看看一个最简单的爬虫流程: 第一步要确定爬取页面的链接,由于我们通常爬取的内容 ...
随机推荐
- Java反射之成员变量的反射
上一篇介绍了Java反射之构造方法反射.这次我们在说一说如何反射类中的成员变量并用作一个简单案例. [一]Field类 Filed类代表字段,包含字段拥有的所有属性,比如修饰符,变量类型,值等等,Fi ...
- Hadoop集群搭建(六)~安装JDK
前面集群的准备工作都做完了,本篇记录安装JDK,版本位1.8 1,在opt目录下创建software和module文件夹:software用来放安装包,module为安装目录 2,把JDK和hadoo ...
- 使用Python批量获取学生期末考试成绩
以下是我们学校对于期末考试成绩临时查询的一个网站 我突发奇想,可不可以通过爬虫的方式批量获取成绩信息 于是说干就干 首先观察网页的请求 通过查看,我们可以很明显看到网站查询是通过对https://wx ...
- Linux中MySQL二进制安装步骤
MySQL二进制安装步骤 安装依赖环境 [root@node3 ~]# yum -y install libaio 将mysql-5.7.26-linux-glibc2.12-x86_64.tar.g ...
- (转)浅析epoll – epoll函数深入讲解
原文地址:http://www.cppfans.org/1418.html 浅析epoll – epoll函数深入讲解 前一篇大致讲了一下epoll是个什么东西,优点等内容,这篇延续上一篇的内容,主要 ...
- 使用vue-router+vuex进行导航守卫(转)
前言:想要实现登录后才能进入主页等其他页面,不然都会跳转到登录页.但是Vuex有个不够完美的地方,一旦刷新页面就会没了,所以还要用到localStorage. 一.router.js: import ...
- Python 之 copy() 与 deepcopy() 之间的区别
在 Python 之中,如果想要复制一个对象就免不了要理解浅复制与深复制.这也是 Python 与其他语言的区别之一. Python 的数据存储方式与其他语言不同.当你定义了一个变量: a = [, ...
- Jmeter中使用MD5方法
在现在这家公司做测试的项目有用到鉴权,token的生成方式有使用到md5,具体的请求url和入参就不方便透露,讲一讲使用方法吧! 自带的Jmeter插件中是没有这个md5的所以,我们可以 (1)打开选 ...
- 解决tinyint映射成boolean/byte的问题
前言 最近受疫情的影响,公司要做一个类似一码通的系统为客户服务.由我来进行表的设计.创建表之后需要逆向生成Java的entity.mapper.mapper.xml.由于我在数据库中定义了大量 tin ...
- CTF_WriteUp_HTTP——302临时重定向问题
HTTP--302临时重定向 题目描述 点击给出的链接后,没有发生任何变化. 解决方案 通过擦好看网络请求,可以发现发生了302临时跳转,所以我们无法通过浏览器直接访问未跳转的页面,而flag 可能藏 ...