re模块相关介绍
re模块
模块和实际工作时间的关系
time模块和时间是什么关系?
re模块和正则表达式的关系?
有了re模块就可以在python语言中操作正则表达式
正则表达式
1:什么是正则表达式?
一套规则---匹配字符串的
2:正则表达式能做什么?
1.检测一个输入的字符串是否合法-------web开发项目 表单验证
用户输入一个内容得时候,我们要提前做检测,能够提高程序的效率并且减轻服务器的压力
2.从一个大文件中找到所有符合规则的内容 ---日志分析\爬虫
能够高效的从一大段文字中快速找到符合规则的内容
3:正则规则
所有的规则中的字符就刚好匹配到字符串中的内容
在正则表达式中能够帮助我们表示匹配的内容得符号都是正则表达式中的元字符
元字符都是表示能匹配那些内容,一个元字符总是表示一个字符位置上的内容
1.字符组 [] 描述的是一个位置上能出现的所有可能性
[] 一个中括号只表示一个字符位置
如:匹配a或者b或者c
[0-9] 匹配数字
根据ASCII码表进行范围的比对
[a-zA-Z] 匹配大小写
2.匹配符号
\d -------->[0-9] 表示匹配一位任意的数字
\w -------->[0-9a-zA-Z_] 匹配数字字母下划线
\s --------->表示匹配空白符(空格\tab\enter)
空格 ----->
tab ----->\t
enter回车----->\n
\W ---------->表示匹配非数字字母下划线
\D --------->表示匹配非数字
\S --------->表示匹配非空白符
[\d\D] ----->表示匹配所有
. -------->表示除换行之外的所有
[^\d] 表示匹配非数字
\b表示单词的边界
^ ---------->表示匹配一个字符串的开始
$ ---------->表示匹配一个字符串的结尾
或 a表达式|b表达式
匹配a表达式或者b表达式中的内容,如果匹配a成功了,不会继续和b匹配,所以,如果两个规则有重叠部分,总是把长的放在前面
分组 ()
约束|描述的内容的范围问题
3.量词
{n} 表示匹配n次
{n,} 表示匹配至少n次
{n,m} 表示至少匹配0次或1次
? 表示匹配0次或者1次
+ 表示一次或多次
* 表示0次或多次
4.贪婪匹配
在量词范围允许的条件下,尽量多的匹配内容
.*x 表示匹配任意字符 任意多次数 直至遇到最后一个x后才停下来
非贪婪匹配
元字符 量词 ? 表示非贪婪
元字符 ? 元字符匹配0次或1次
.*?x 表示匹配任意字符 任意多次数 但是一旦遇到x就挺下来
5.转义符
原本有特殊意义的字符,到了表达它本身的意义的时候需要转义
有一些特殊意义的内容,放在字符组中,会取消他的特殊意义
[().*?] 所有的内容放在字符组中会取消他的特殊意义
[a\-c] -在字符组中表示范围,如果不希望他表示范围,需要转义,或者放在字符组的最前面或者最后面
相关说明:
1.为啥要匹配0次
整数 \d+
小数 \d+\.\d+
小数或者整数
\d+(\.\d+)?
2. 匹配手机号码
1[3-9]\d{9}
判断用户输入的内容是否合法,如果用户输入的对就能查到结果,如果输入的不对就不能查到结果
^1[3-9]\d{9}$
从一个大文件中找到所有符合规则的内容
1[3-9]\d{9}
匹配18/15位的身份证,规则如下:
15位:1-9 15
[1-9]\d{14}
18位:1-9 16 0-9/x
[1-9]\d{16}[\dx]
15或18位的身份证
[1-9]\d{16}[\dx]|[1-9]\d{14}
re模块
import re
ret = re.findall("\d+","wrr432ee21r3tg")
print(ret) #找所有 返回一个列表
ret = re.search("\d+","fefrr32r445ergt56")
print(ret) #变量
pritn(ret.group()) #只能拿到一个,拿不到就报错
if ret:
print(ret.group())
预习一个现象并且找到答案 ---分组有关系()
#findall 还是按照完整的正则进行匹配,只是显示括号里面的匹配的内容
#取所有符合条件的,优先显示分组中的
ret = re.findall("8(\d)\d","1845dwfer35435")
print(ret) #4
print(ret)
#search还是按照完整的正则表达式进行匹配,显示也是显示匹配 到的第一个内容,但是我们可以通过给group方法传参数
#变量.group(n)的形式来指定获取n个分组中匹配到内容
ret = re.search("8(\d)(\d)","ewrr2123512343456")
print(ret)
if ret:
print(ret.group())
print(ret.group(1))
print(ret.group(2))
为啥在search中不需要分组优先,而在findall中需要
加上括号是为了对真正需要的内容进行提取
为什么要用分组,以及findall的分组优先到底有什么好处
exp = "3-2*(5+3)"
# a+b或者是a-b并且计算他们的结果
ret = re.search("\d+[+]\d+",exp)
print(ret)
a,b = ret.split("+")
print(int(a)+int(b))
ret = re.search("(\d+)[+](\d+)",exp)
print(int.group(1)+int.group(2))
如果我们要查找的内容在一个复杂的环境中
我们要查的内容并没有一个突出与众不同的特点,甚至会和不需要的杂乱的数据混合在一起
这个时候我们就需要把所有的数据统计出来,然后对所有的数据进行筛选,把我们真正需要的数据对应的正则表达式用()圈起来
ret = re.findall("1(\d)(\d)","133456")
print(ret)
取消分组优先:
ret = re.findall("1(?:\d)(\d)","effed") #取消分组优先?:
什么是爬虫
通过代码获取到一个网页的源码,要的是源码中嵌入的网页上的内容
import requests
ret = requests.get("https:// www.baidu.com").text()
分组和findall的现象
为什么要分组
把想要的内容放到分组里
如何取消分组优先
如果在写正则的时候由于不得已的原因 导致不要内容也得写在分组里
(?:)取消这个分组的优先显示