【干货】python正则表达式应用笔记
正则表达式 (Regular Expression) 又称 RegEx, 是用来匹配字符的一种工具. 在一大串字符中寻找你需要的内容. 它常被用在很多方面, 比如网页爬虫, 文稿整理, 数据筛选等等. 最简单的一个例子, 比如我需要爬取网页中每一页的标题. 而网页中的标题常常是这种形式.
<title>我是标题</ title>
而且每个网页的标题各不相同, 我就能使用正则表达式, 用一种简单的匹配方法, 一次性选取出成千上万网页的标题信息. 正则表达式绝对不是一天就能学会和记住的, 因为表达式里面的内容非常多, 强烈建议, 现在这个阶段, 你只需要了解正则里都有些什么, 不用记住, 等到你真正需要用到它的时候, 再反过头来, 好好琢磨琢磨, 那个时候才是你需要训练自己记住这些表达式的时候.
简单匹配
正则表达式无非就是在做这么一件事。在文字中找到特定的内容。我们在“dog runs to cat” 这句话中寻找存在“cat” 或者 “bird” 。
但是正则表达式绝非不止这些简单的匹配,它还能做更加高级的内容。要使用正则表达式,首先需要调用一个python的内置模块 re 。然后我们重复上面的步骤,不过这次使用正则。可以看出,如果 re.search() 找到了结果,它会返回一个match 的 object 。如果没有匹配到,它会返回 None 。这个re.search() 只是 re 中的一个功能,之后会介绍其他功能。
灵活匹配
除了上面的简单匹配,下面的内容才是正则的核心内容,使用特殊的 pattern 来灵活匹配需要找的文字。
如果需要找到潜在的多个可能性文字,我们可以使用 [ ] 将可能的字符囊括进来。比如 [ ab ]就说明我想要找的字符可以是 a 也可以是 b 。这里我们还需要注意的是,建立一个正则的规则,我们在 pattern 的 "" 前面需要加上一个 r 用来表示这是正则表达式,而不是普通字符串。通过下面这种形式,如果字符串中出现 "run" 或者 "ran" , 它都能找到 。
同样,中括号 [ ] 中还可以是一下这些或者是这些的组合。比如 [ A-Z ] 表示的就是所有大写的英文字母。 [ 0-9a-z ] 表示可以是数字也可以使任何小写字母。
按类型匹配
除了自己定义的规则,还有很多匹配的规则时提前就给我们定义好了的。下面有一些特殊的匹配类型给大家总结一下,然后再上一些例子。
- d : 任何数字
- D : 不是数字
- s : 任何 white space, 如 [tnrfv]
- S : 不是 white space
- w : 任何大小写字母, 数字和 “” [a-zA-Z0-9]
- W : 不是 w
- b : 空白字符 (只在某个字的开头或结尾)
- B : 空白字符 (不在某个字的开头或结尾)
- \ : 匹配
- . : 匹配任何字符 (除了 n)
- ^ : 匹配开头
- $ : 匹配结尾
- ? : 前面的字符可有可无
下面就是具体的举例说明。
如果一个字符串有很多行,我们想使用 ^ 形式来匹配行开头的字符,如果通常的形式是不成功的。比如下面的 " | " 出现在第二行,这时候,我们要使用另一个参数,让 re.search() 可以对每一个单独处理。这个参数就是 flags = re.M ,或者这样写也行 flags.re.MULTILINE 。
重复匹配
如果我们想让某个规律被重复使用,在正则里面也是可以实现的,而且实现的方式还有很多。具体可以分为这三种:
-
*
: 重复零次或多次 -
+
: 重复一次或多次 -
{n, m}
: 重复 n 至 m 次 -
{n}
: 重复 n 次
举例如下:
分组
我们甚至可以为找到的内容分组,使用 ( ) 能轻松实现这件事。通过分组,我们能轻松定位所找到的内容。比如这个 ( d+ ) 组里,需要找到的是一些数字,在 ( .+ ) 这个组里,我们会找到 " Date: "后面的所有内容。当使用 match.group( ) 时,它会返回所有组里的内容,而如果给 .group(2) 里加了一个数,它就能定位你需要返回哪个组里的信息。
有时候,组会很多,光用数字可能比较难找到自己想要的组,这时候,如果有一个名字当索引,会是一件很容易的事。我们需要在括号的开头写上这样的形式 ?P<名字> 就给这个组定义一个名字。然后就能用这个名字找到这个组的内容。
findall
前面我们说的都是只找到最开始匹配上的一项而已,如果需要找到全部的匹配项,我们可以使用 findall 功能。然后返回一个列表。注意下面还有一个新的知识点, | 是 or 的意思,要不是前者要不是后者。
replace
我们还能通过正则表达式匹配上一些形式的字符串然后再替换掉这些字符串。使用这种匹配 re.sub( ) ,将比python自带的string.replace( ) 要灵活的多。
split
再来我们python中有个字符串的分割功能,是split,比如" a is b".split(" "),这样它就会产生一个列表来保存所有单词。但是在正则中,这种普通的分割也可以做的淋漓尽致。
compile
最后我们还能使用 compile 过后的正则,来对这个正则重复使用。先将正则 compile 进一个变量,比如 compiled_re ,然后直接使用这个 compiled_re 来搜索。
小抄
- 如何评价一段代码
- java系统高并发的解决方案
- Spring Boot 中使用 Redis
- 使用 Jedis 连接操作 Redis
- 浅析ReDoS的原理与实践
- 使用 Executors,ThreadPoolExecutor,创建线程池,源码分析理解
- CentOS+Nginx+Tomcat搭建高性能负载均衡集群
- Java 四种线程池的使用
- 搭建 Jenkins-2.83 服务,部署 spring boot 项目
- Spring Boot 中使用 Java API 调用 lucene
- Spring Boot 中使用 Java API 调用 Elasticsearch
- Spring Boot 中使用 公共配置
- WebView 和 JS 交互,如何将 Java 对象和 List 传值给 JS ?
- Spring Boot 中使用 LogBack 配置
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php简单检测404页面的方法示例
- thinkPHP3.2使用RBAC实现权限管理的实现
- Flutter以两种方式实现App主题切换的代码
- PHP中非常有用却鲜有人知的函数集锦
- PHP针对redis常用操作实例详解
- thinkPHP5使用Rabc实现权限管理
- PHP实现cookie跨域session共享的方法分析
- VS Code开发React-Native及Flutter 开启无线局域网安卓真机调试问题
- Laravel5.4简单实现app接口Api Token认证方法
- PHP生成zip压缩包的常用方法示例
- Android Studio用genymotion运行后小图标无法显示问题
- PHP7数组的底层实现示例
- 浅析Flutter AbsorbPointer 与 IgnorePointer的区别
- php用wangeditor3实现图片上传功能
- Flutter集成到已有iOS工程的方法步骤