文章更新于:2020-03-30

一、语法格式

1、非打印字符

操作符 说明 实例
\cx 匹配由x指明的控制字符 \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Za-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 的向后引用。

如果前面的条件都不满足,若 nm 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm
\nml 如果 n 为八进制数字 (0-3),且 ml 均为八进制数字 (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} 扩展前一个字符 mn 次(含 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 能匹配 zfood(z|f)ood 则匹配 zoodfood

二、实战演练

语法 描述
^[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 爬虫:学爬虫必学的正则表达式的更多相关文章

  1. Python栈溢出【新手必学】

    python3.5.4 递归函数最恶心的时候莫非栈溢出(Stack overflow).PS:另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个P ...

  2. 学.net必学的东西 10项【不知道我能不能学这么多,!- -,光程序编辑我都累死了】

    原文发布时间为:2008-10-30 -- 来源于本人的百度文章 [由搬家工具导入] 10项.NET必学的技术2007年08月28日 星期二 14:58 1、WCF (Windows Communic ...

  3. Python分布式爬虫必学框架Scrapy打造搜索引擎

    Python分布式爬虫必学框架Scrapy打造搜索引擎 部分课程截图: 点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/1-wHr4dTAxfd51M ...

  4. Python分布式爬虫必学框架Scrapy打造搜索引擎 ✌✌

    Python分布式爬虫必学框架Scrapy打造搜索引擎  ✌✌ (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 第1章 课程介绍 介绍课程目标.通过课程能学习到 ...

  5. Python爬虫工程师必学——App数据抓取实战 ✌✌

    Python爬虫工程师必学——App数据抓取实战 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统 ...

  6. Python爬虫工程师必学APP数据抓取实战✍✍✍

    Python爬虫工程师必学APP数据抓取实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...

  7. Python分布式爬虫必学框架scrapy打造搜索引擎✍✍✍

    Python分布式爬虫必学框架scrapy打造搜索引擎  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身 ...

  8. Python爬虫工程师必学——App数据抓取实战

    Python爬虫工程师必学 App数据抓取实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大 ...

  9. Python爬虫:学爬虫前得了解的事儿

    这是关于Python的第14篇文章,主要介绍下爬虫的原理. 提到爬虫,我们就不得不说起网页,因为我们编写的爬虫实际上是针对网页进行设计的.解析网页和抓取这些数据是爬虫所做的事情. 对于大部分网页来讲, ...

  10. 学爬虫,需要掌握哪些Python基础?

    入手爬虫确实不要求你精通Python编程,但基础知识还是不能忽视的,那么我们需要哪些Python基础呢? 首先我们先来看看一个最简单的爬虫流程:   第一步要确定爬取页面的链接,由于我们通常爬取的内容 ...

随机推荐

  1. RStudio终端操作

    转于:https://support.rstudio.com/hc/en-us/articles/115010737148-Using-the-RStudio-Terminal#send 原文是英文版 ...

  2. Linux查看目录树形结构

    安装tree. yum -y install tree 查看是否安装成功 yum list installed tree 执行tree命令查看目录树形结构 tree

  3. 2016 Multi-University Training Contest 1 T4

    http://acm.hdu.edu.cn/showproblem.php?pid=5726 求不修改区间gcd可以用线段树或者倍增. 求l-n的我们注意观察gcd(a​l​​,a​l+1​​,... ...

  4. 项目部署Django+celery+redis

    celery介绍 1.celery应用举例 1.Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,   如果你的业务场景中需要用到异步任务,就可以 ...

  5. Natas8 Writeup(常见编码、php函数)

    Natas8: 同样给了php源码,审计源码,发现给了一个预设参数encodedSecret,以及一个加密函数encodeSecret, 该函数将secret参数先进行base64编码.然后用strr ...

  6. kubernetes 1.17.2结合ceph13.2.8 实现jenkins部署并用traefik2.1代理

    注:关于ceph.kubernetes集群的部署在此不声明,相信搜到本篇博文,你一定对ceph.kubernetes的部署环节手刃有余. 注:本篇博文牵扯到的技术点有:ceph.kubernetes. ...

  7. Unity 游戏框架:命名的力量--变量

    变量的命名入门 大家先来试着理解一下这段代码: var todoList = new TodoList(); todoList.Todos = new List<Todo>(); var ...

  8. 「SWTR-04」Sweet Round 04 游记

    比赛链接 由于 \(\texttt{Sweet Round}\) 比赛挺好的(关键不知道为啥\(Unrated\) 开篇总结(大雾):这次比赛题目不错(有思维含量) 尽管我不会做. 我一看 \(T1\ ...

  9. 单调栈-Maximum Width Ramp

    2020-01-23 19:39:26 问题描述: 问题求解: public int maxWidthRamp(int[] A) { Stack<Integer> stack = new ...

  10. PAT 乙级 1007. 素数对猜想 (20) c++ 筛选法求素数

    PAT 乙级 1007. 素数对猜想 (20) c++ 筛选法求素数 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数 ...