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基础呢? 首先我们先来看看一个最简单的爬虫流程: 第一步要确定爬取页面的链接,由于我们通常爬取的内容 ...
随机推荐
- 深入理解yield from语法
本文目录 为什么要使用协程 yield from的用法详解 为什么要使用yield from . 为什么要使用协程# 在上一篇中,我们从生成器的基本认识与使用,成功过渡到了协程. 但一定有许多人,只知 ...
- 扫码枪读取条形码数据(vue)
扫码枪是模拟键盘输入的,所有事件为document.onkeypress = function(){}. 在vue项目中,是没有window.onload的,所以在created钩子函数中做: var ...
- jQuery万能放大镜插件(普通矩形放大镜)
插件链接:http://files.cnblogs.com/files/whosMeya/magnifier.js 1.在jquery下插入. 2.格式:magnifier("需要插入的位置 ...
- React利用Antd的Form组件实现表单功能(转载)
一.构造组件 1.表单一定会包含表单域,表单域可以是输入控件,标准表单域,标签,下拉菜单,文本域等. 这里先引用了封装的表单域 <Form.Item /> 2.使用Form.create处 ...
- Abp 抛出详细异常
Abp在默认情况下,只要后端抛出异常,一概过滤为服务器错误并弹出,这样并不方便调试,这个时候需要开启一个开关即可: 在模块预初始化PreInitialize中开启,代码如下: , 这样就可以看到详细的 ...
- scrapy框架在未登录模式下爬取文本,文件和图片的几点收获
1.什么是API接口? https://baijiahao.baidu.com/s?id=1597881116201407882&wfr=spider&for=pc 2.spider文 ...
- jQuery的简单用法(jQuery的简介,选择器,属性和css,文档处理)
一.jQuery简介 1.1. JS库 JavaScript 库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互客户端页面, 并且兼容各大浏览器. 1.2. 当前流行的 JavaSc ...
- 10个python爬虫入门实例
昨天和伙伴萌一块学习,写了几个简单的入门实例 涉及主要知识点: web是如何交互的 requests库的get.post函数的应用 response对象的相关函数,属性 python文件的打开,保存 ...
- ABP实践(4)-abp前端vue框架之简单商品增删改查(帮助刚入门的新手快速了解怎么才能加入自己的功能并运行起来)
提示:如有不明白的地方请先查看前3篇ABP实践系列的文章 1,下载及启动abp项目前后端分离(netcore+vue) 2,修改abp数据库为mysql 3,商品系列api接口(本文主要依赖在这个商品 ...
- Andorid 添加MenuPopup