正则的含义
正则表达式就是用来操作字符串的一种逻辑公式
正则表达式的应用场景
数据分析时数据获取的文本筛选
写爬虫代码的时候,网页数据的匹配
写前端代码的时候,用户输入数据的验证
测试人员对请求结果的数据验证
常用的格式校验
邮箱验证
IP地址验证
电话号码验证
身份证号码验证
密码强度验证
网址验证
汉字验证 [\u4e00-\u9fa5]
…
凡是有一定规律的,批量的数据获取,都可以使用正则表达式来完成
import re
s = '百度的网站是:http://www.baidu.com'
reg = 'http://[w]{3}\.[a-z0-9]*\.com'
re.findall(reg,s)
# --> http://www.baidu.com
#要想匹配中文
re.findall('[\u4e00-\u9fa5]', s)
# --> ['百', '度', '的', '网', '站', '是']
要注意 \ 是个转义字符
元字符
字符 | 说明 |
---|---|
. | 代表的是换行符以外的任意字符。 换行符是:(不同的操作系统有不同的换行符) \n \r\n |
\w | 匹配字母、数字、下划线、汉字的一个字符 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
反义代码
字符 | 说明 |
---|---|
\W | 匹配的任意 不是 字母、数字、下划线、汉字 的字符 |
\S | 匹配任意 不是 空白符的字符 |
\D | 匹配任意 不是 数字的字符 |
限定符
符号 | 说明 |
---|---|
* | 代表的重复0次或者是多次 |
+ | 代表的是重复1次或者是多次 |
? | 代表的是重复0次或者是1次 |
{n} | 重复n次,举例:{3}指的就是重复3次 |
{n,} | 重复n次或者更多次数 |
{n,m} | 重复n次到m次,所以这里m一般要比n大 |
分组匹配
s = '我的qq号是42197393 ,我的邮编是10000'
#reg = '\d{5,8}'
reg = '(\d{8}).*(\d{5})'
re.search(reg,s)
#得到一个对象
# --> <_sre.SRE_Match object; span=(6, 26), match='42197393 ,我的邮编是10000'>
re.search(reg,s).group(1)
# --> 42197393
re.search(reg,s).group(2)
# --> 10000
findall / search/match 区别
- findall 是查找所有的
- search 匹配第一个
- match 匹配开头的
s = 'HelloWorldHelloworld'
reg = 'Hello'
re.match(reg,s)
#-->此次匹配的Hello是开头的
re.search(reg,s)
#-->此次匹配的Hello是第一个hello
贪婪与非贪婪
- 贪婪的意思是尽可能多的匹配
- 非贪婪的意思就是尽可能少的匹配
- 非贪婪操作符是问号:‘符号?’
- ?号代表的是重复0次或者是1次,再加一个问号,代表的是非贪婪操作,那么最后就只匹配0次
s = 'bbbbbbbaiduuuuuu'
reg = 'baidu??'
re.findall(reg,s)
# --> baid
分支条件匹配
s = '电话号码有: 010-78472328 0431-9837523 0432-97462743'
# 分支条件匹配原则,前边的条件尽量匹配少的数据,后边的条件匹配多的数据
reg = "0\d{2}-\d{8}|0\d{3}-\d{8}|0\d{3}-\d{7}"
re.findall(reg,s)
# --> ['010-78472328', '0431-9837523', '0432-97462743']
零宽断言
- 匹配"正则表达式reg"前边的位置 (?=reg)
- 匹配"正则表达式reg"后边的位置 (?<=reg)
- 匹配后边跟的不是"正则表达式reg"的位置 (?!reg)
- 匹配前边不是"正则表达式reg"的位置 (?<!reg)
s = 'helloworld'
reg='l{2}o(?=world)'
re.findall(reg,s)
# --> llo