第十章 正则表达式

一、什么是模块
模块:一功能的集合。一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀
类型:
- 内置模块:安装python解释器自带的模块
- 第三方模块:需要我们自己安装的模块
- 自定义模块:我们自己写的模块
模块就是给我们提供功能的,这个要操作的内容本来就存在,模块只不过是python提供给我们去操作这个内容的方法
re模块
在python中使用正则表达式
二、正则表达式
- 本身和Python没有关系,就是匹配字符串内容的一种规则。正则表达式是对字符串操作的一种逻辑,就是用事先定义好的一些特定字符,以及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
1 从大段的文字中找到符合规则的内容
爬虫:从网页的字符串中获取你想要的数据
日志分析
2 判断某个字符串是否完全符合规则的内容
表单验证:手机号、QQ号码、邮箱、银行卡号、身份证号、密码
- 正则表达式只和字符串打交道
 
正则表达式的规则:
规则:字符串 从字符串中找到符合规则的内容
1. 字符组:
[]写在中括号中的内容,都出现在下面的某一个字符的位置上都是符合规则的
- [0-9] 匹配数字
- [a-z] 匹配小写字母
- [A-Z] 匹配大写字母
- [8-9] 所有都可以切片
- [a-zA-Z] 匹配大小写字母
- [a-zA-Z0-9] 匹配大小写字母和数字
- [a-zA-Z0-9] 匹配数字字母下划线
(前后顺序主要还是按照ASCII表来做参考的,比如直接写[A-z]是可以的,因为在ASCII表中大写字母的值区间为65-90,而小写字母的区间的为97-122。这个顺序是从小到大的。但是如果写[a-Z]就是错误的,还需要注意,[A-z]这种写法还会将ASCII中91到96中的这几个字符添加到字符组中。)
转义符:\
2. 元字符:
和转义字母相关的元字符:\w \d \s (\n \t) \b \W \D \S
- \w 匹配数字、字母、下划线 [a-zA-Z0-9]
- \d 匹配所有的数字(digit) [0-9]
- \s 匹配所有的空白符:空格、制表符、space [\n\t ]
匹配换行符 回车:\n
匹配制表符 tab:\t
匹配空格
- \W \D \S 和\w \d \s取反
[\s\S]、[\d\D]、[\w\W]是三组全集,意思是匹配所有字符
- \b 表示单词边界
 
 
- ^ 匹配一个字符串的开始
- $ 匹配一个字符串的结束
- . 匹配除换行符之外的所有字符
- [] 只要出现在中括号中的内容都可以被匹配
- [^] 只要不出现在中括号中的内容都可以被匹配
有一些有特殊意义的元字符进入字符组中会恢复他本来的意义: .、 |、 []、()
- | 或:符合a的规则或者b规则的都可以被匹配
如果a规则是b规则的一部分,且a规则比b更要苛刻(长)就把a规则写在前面
将更复杂的,更长的规则写在最前面
- () 分组:表示给几个字符加上量词约束需求的时候,就给这些量词分在一个组
量词:
- {n} 表示这个量词之前的字符出现了n次
- {n,} 表示这个量词之前的字符至少出想了n次
- {n, m} 表示这个量词之前的字符出想了n-m次
- ? 表示匹配量词之前的字符出想0次或者1次,表示可有可无
- + 表示匹配
 
正则表达式的匹配特点:贪婪匹配
它会在允许的范围内取最长的结果
非贪婪模式/惰性匹配:默认为贪婪匹配,如果在量词后面加上?将转换为惰性匹配
- .*?x 匹配任意非换行符字符任意长度,直到遇到x就停止
 
几个字符的组合关系:
字符/元字符 只约束一个字符
字符+量词 约束一个字符连续出现的次数
字符+量词+? 约束一个字符出现的最小次数
训练:
1、匹配整数或者小数:
-?\d*\.?d+
-?\d+\.\d+|-?\d+
-?\d+(\.\d+)?
2、匹配年月日 格式2018-12-6
^[0-9]\d{3}-(1[0-2]|0?[1-9])-(3[01]|[12]\d|0?[1-9])$
3、匹配QQ号
[1-9][0-9]{4, 11}
4、11位的电话号码
1[3-9]\d{9}
5、长度为8-10位的用户密码:包含数字、字母、下划线
\w{8,10]
6、匹配验证码:4位数字组成
[\da-zA-Z]{4}
[0-9a-zA-Z]{4}
7、匹配邮箱地址
邮箱规则
@之前必须有内容且只能是字母(大小写)、数字、下划线(_)、减号(-)、点(.)
@和最后一个点(.)之间必须有内容且只能是字母(大小写)、数字、点(.)、减号(-),且两个点不能挨着
最后一个点(.)之后必须有内容且内容只能是字母(大小写)、数字且长度为大于等于2个字节,小于等于6个字节
[0-9a-zA-Z][\w\-.]+@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*\.[A-Za-z0-9]{2,6}
8、从类似
<a>wahaha</a>
<b>banana</b>
<h1>qqxing</h1>
这样的字符串中
1)匹配除wahaha、banana、qqxing内容:
# 有些时候你要匹配的内容和你不想匹配的内容符合的正则规则是一样的:
\w{6}
>\w+<
2)匹配出a,b,h1这样的内容:
<\w+>
9、1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
从上面算式中匹配出内层没有其他小括号的表达式
\([^()]+\)
posted @ 2018-08-17 17:14  久末丶  阅读(319)  评论(0编辑  收藏  举报