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基础呢? 首先我们先来看看一个最简单的爬虫流程: 第一步要确定爬取页面的链接,由于我们通常爬取的内容 ...
随机推荐
- 程序员过关斩将-- 喷一喷坑爹的面向UI编程
摒弃面向UI编程 为何喷起此次话题,因为前不久和我们首席架构师沟通,谈起程序设计问题,一不小心把UI扯进来,更把那些按照UI来编程的后台工程师也扯了进来.今天特意百度了一下(其实程序员应该去googl ...
- 【TIJ4】第五章全部习题
第五章习题 5.1 package ex0501; //[5.1]创建一个类,它包含一个未初始化的String引用.验证该引用被Java初始化成null class TestDefaultNull { ...
- mysql锁机制和事务隔离
mysql事务 1.InnoDB事务原理 事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致性状态转换为另一种一致性状态. 在数据库提交时,可以确保要么所有修 ...
- MyBatis框架——快速入门
主流的ORM框架(帮助开发者实现数据持久化工作的框架): 1.MyBatis: 半自动化ORM框架,半自动:指框架只完成一部分功能,剩下的工作仍需开发者手动完成. MyBatis 框架没有实现 POJ ...
- Systematic comparison of strategies for the enrichment of lysosomes by data independent acquisition 通过DIA技术系统比较各溶酶体富集策略 (解读人:王欣然)
文献名:Systematic comparison of strategies for the enrichment of lysosomes by data independent acquisit ...
- Jsp el表达式无解析 解决
需要开启 el isELIgnored="false" 这时已经可以正常访问了
- 【原创】(六)Linux进程调度-实时调度器
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- go语言周边
博主收藏的go语言资料,分享一波~~~ 官网 https://golang.org/ (被墙) 镜像: http://docscn.studygolang.com/ 下载镜像: https://gom ...
- WordPress 版本升级、主题升级记录
版本升级 升级很简单,但是以防万一,先备份数据. 一.备份数据库 mysqldump -u root -p --database myblog > myblog.sql 若需要还原可执行如下操作 ...
- 【干货】史上最全的Tensorflow学习资源汇总
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:AI小昕 在之前的Tensorflow系列文章中,我们教大家 ...