正则表达式 提取数据
正则表达式
1. 正则表达式概念
正则表达式就是记录文本规则的代码
2. 正则表达式的样子
0\d{2}-\d{8} 这个就是一个正则表达式,表达的意思是匹配的是座机号码
3. 正则表达式的特点
正则表达式的语法很令人头疼,可读性差
正则表达式通用行很强,能够适用于很多编程语言
1. re模块的使用过程
在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re
# 导入re模块
import re
# 使用match方法进行匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上一步匹配到数据的话,可以使用group方法来提取数据
result.group()2. re模块示例
运行结果为:
定义
用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。
常见语法
字符
语法
说明
表达式案例
完整匹配字符串
一般字符
匹配自身
abc
abc
.
匹配任意除换行符\n外的字符。在DOTALL模式中也能匹配换行符
a.c
abc
\
转义字符,使后一个字符表示字符本身。
a.c
a.c
[...]
选取字符范围
a[bcd]e
abe 或 ace 或 ade
预定义字符集(可以写在字符集[...]中)
语法
说明
表达式案例
完整匹配字符串
\d
数字:[0-9]
a\dc
a1c
\D
非数字:
a\Dc
abc
\s
空白字符:[<空格>\t\r\n\f\v]
a\sc
a c
\S
非空白字符:
a\Sc
abc
\w
单词字符:[A-Za-z0-9_]
a\wc
abc
\W
非单词字符:
a\Wc
a c
数量词(用在字符或(...)之后)
语法
说明
表达式案例
完整匹配字符串
*
匹配前一个字符0次或无限次。
abc*
abccc
+
匹配前一个字符1次或无限次。
abc+
abccc
?
匹配前一个字符0次或1次。
abc?
abc 或 ab
{m}
匹配前一个字符m次。
ab{2}c
abbc
匹配单个字符
示例1:
运行结果:
示例2:[]
运行结果:
示例3:\d
运行结果:
示例4:\D
运行结果:
示例5:\s
运行结果:
示例6:\S
运行结果:
示例7:\w
执行结果:
示例8:\W
执行结果:
思考
匹配密码中的其中一位,密码是由字母、数字、下划线组成,请列举的方式匹配?
匹配多个字符
示例1:*
需求:匹配出一个字符串第一个字母为大小字符,后面都是小写字母并且这些小写字母可 有可无
运行结果:
示例2:+
需求:匹配一个字符串,第一个字符是t,最后一个字符串是o,中间至少有一个字符
运行结果:
示例3:?
需求:匹配出这样的数据,但是https 这个s可能有,也可能是http 这个s没有
运行结果:
示例4:{m}、{m,n}
需求:匹配出,8到20位的密码,可以是大小写英文字母、数字、下划线
运行结果:
思考
如何使用正则表达式把qq:10567这样的数据匹配处理?
匹配开头和结尾
1. 匹配开头和结尾的正则表达式
代码
功能
^
匹配字符串开头
$
匹配字符串结尾
示例1:^
需求:匹配以数字开头的数据
运行结果:
示例2:$
需求: 匹配以数字结尾的数据
运行结果:
示例3:^ 和 $
需求: 匹配以数字开头中间内容不管以数字结尾
运行结果:
2.除了指定字符以外都匹配
: 表示除了指定字符都匹配
需求: 第一个字符除了aeiou的字符都匹配
执行结果
思考
1.匹配以数字开头中间内容不管以数字结尾, 结尾不要4或者7
2.匹配出163的邮箱地址,且@符号之前有4到20位,例如hello@163.com
3.匹配出11位手机号码
4.匹配出微博中的话题, 比如: #幸福是奋斗出来的#
高级匹配
compile 方法
作用
对正则表达式进行编译构建对象,后续不需要重新构建正则表达式上下文环境,从而提高效率
使用方式
贪婪模式和非贪婪模式区别
贪婪模式
(.*)尽可能多的匹配
非贪婪模式
(.*?)一旦匹配到就结束
DOTALL模式
.符号匹配所有的字符包括换行符
忽略大小写模式
正则匹配时忽略大小写
原始字符串 r 的用法
让字符串内部的转义字符没有任何意义。
四大检索方法
match 开头匹配,只匹配一次
search 全局匹配,只匹配一次
findall 匹配所有符号条件的数据,返回是 结果列表
finditer 迭代对象,迭代 Match 对象
match 和 seach 区别
match 开头匹配,只匹配一次
search 全局匹配,只匹配一次
findall 和 finditer 区别
findall 优点:使用简单,缺点:必须把所有数据搜索返回再返回
finditer 优点:找到就返回,可以边找边返回
如果数据量小 使用 findall
如果数据量大 使用 finditer
代码实现
分组与替换方法
分组
通过给定字符串进行对数据进行分组
替换
通过给定的正则表达式和替换字符进行替换
常见提取方式
使用流程
拷贝原有字符串内容
把所要提取的数据使用
(.*)或(.*?)进行替换使用
findall或finditer进行数据提取
代码实现
Last updated
Was this helpful?