python学习 day16 (3月21日)----(正则)
背景:(对程序的伤害)
#__author : 'liuyang' #date : 2019/3/21 0021 上午 10:34 #模块和功能之间的关系 #先有的功能 #正则表达式 #time模块 是用来操作时间的 #re 模块 是用来操作正则表达式的 #什么是‘正则’? #能做什么事? #在注册 页输入的内容 是否合法? #不检测也 , 不合法(不存在手机号) ,发不出去 #send_msg('msg',1345433191) #发过去 每次都发 占资源 对程序非常大的伤害 #一秒点 500下 ,每次都发 太伤害 应用 #所以检测 #11位 ,1 开头 ,全数字, 13,14,15,16,17,18,19 #从一个大文件中 将多有的手机号码都取出来 # 正则表达式 #字符串的规则 #给字符串定义一个规则来 帮助我们: #1 .检测某一段字符串 是否符合规则 #2. 从一大段 文字中将符合规则的匹配出来 #爬虫 # 只和字符串相关 #规则 #元字符 #量词 #简单的字符串的筛选和匹配
正则表达式的应用: 网站(http://tool.chinaz.com/regex)
# 场景一 :检测某一段字符串是否符合规则
# 场景二 :从某一段文字中找到符合规则的内容
一元字符:字符组与非字符组
字符组[]描述的是一个字符位置上的内容规则 #[012345] #[0-5] #[0-9] #[9-0] 不能从大到小 来规定范围 #字符组内所有的范围都是根据ascii 码匹配 一 # 个字符组代表一个位置 多个多个位置 非字符组 [^123] #^hello 能匹配到整行的开始 第一个位置 # hello$ 结束符
一些规则:
#【0-9】== \d 只能匹配 0-9 匹配任意一个数字 digit #【A-Z0-9a-z_】\w 字母数字下划线 # \n 匹配回车 换行 # \t 匹配制表符 table # 空格 本身匹配 空格 # \s 匹配所有的制表符 # 规则+\b 匹配一个单词的边界 # 反义词 #\W 除了字母数字下划线之外的 #\D 除了数字之外的所有 #\S 除了空白之外的所有 #. 匹配换行符 之外的 所有字符 #\d \w \s (\n \t) #\D \W \S # 匹配所有:[\D\d] [\W\w][\S\s]
开始和结束 分组和或
^hello$ # ^hello....$ 这样的话 可以后面的有 4个 #a^hello hello$b 错误用法✖ # ^永远在一个规则的最前面 ^和$ 规定了这个字符串的长度 #^\d\d\d\d\d\d\d\d\d\d\d$ 分组和 或 #| 表示 或 123|456 两边的都匹配一条结果 # www.baidu.com # www\.oldboy\.com # 转移一下 否则@也可以被匹配到 # www.(baidu|oldboy).com
#元字符总结
# \d 数字 \w 字符数字下划线 \s 空 \n换行 \t table
# 与上相反:\D \W \S (\b 匹配一个单词的结尾)
# [] , [^] #字符组 或非字符组
#^ $ #开始 结束 弄上结束符 便只检测一个了
#| # 或永远把相对长的规则放在左侧 先匹配
#() 分组
# . 除了换行符
二.量词
\d{n} 表示出现n次 {n,} 表示至少出现n次 {n,m} 表示出现n-m次 ? 表示匹配 0 次 或 1 次 + 表示匹配 1 次 或 多 次 * 表示匹配 0 次 或 多 次 ? + + = *
元字符 量词
匹配一个字符的内容 表示匹配的数量
# 匹配整数 # [1-9]\d* 可以匹配一次和多次 |0 在加上0 # 01111什么的排除 # 匹配小数 +的意义 小数点前面 有1位 # \d+\.\d+ # 匹配一个整数或者小数 # \d+\.\d+|([1-9]\d*|0) #\d+\.?\d* #\d + #必须有整数 \.?#可以存在可不 \d * 必须有 # \d+(\.\d*)? # 分组 要不不出现 或者都出现
# ^ $
# 海.
# ^海
# ^海.$ 只能匹配两个
# 海$
# 在量词范围内尽可能多的匹配 ---贪婪匹配
# 李.{1,3}李姐和李大打得大和李三
# 李姐和李
# 李三
# [\d] [\d]+ 123dada1 4 和 2
匹配身份证号码
# 15 位 首位不能为0 # 18位 首位 不能为0 末尾可能是x 和 数字 # ^[1-9]\d{14}$ # (^[1-9]\d{16}(x|\d)$) # 合起来 # ^([1-9]\d{16}(x|\d)|[1-9]\d{14})$ # ^[1-9]\d{14}(\d{2}[\dx])?$
三.转义
# \\\\n # s = '\\n' #转义 #在测试的网页上写的是什么 就直接复制过来 #然后在字符串 外面加上一个r # r'\\n' --> r'\n' # t't' # \t \本身具有转义作用 相当于改变了本来面目 # \\ \ 本身具有转义作用 相当于转义了 转义的特殊作用 # 特殊字符的 才会匹配 \n \t
惰性匹配
# 惰性匹配 #x需要我们自己设置的,尽可能少的匹配 # a.* 以a开头任意一个字符串 都可以被匹配出来 # a.*? 非贪婪 尽可能少取 # 直接a等于 上 #a.*?x 遇到第一个 x 就停止 a-x
两种算法 小原理: 贪婪: # #回溯算法 a.*x 很开心 匹配到最后了 勤快 # #回溯到 倒数第一个 x 停止了 贪婪匹配 为了简单 也不勤苦 # 惰性: # #匹配到第一个a 之后的每一个 值 判断是不是 x 问问.* 是的话就停止
总结:
#正则表达式 :(java, c ,python) 都可以用没有关系和py #检测字符串是否符合规则 #从一大串文字中找到符合规则的 #元字符 # 。。。 #量词 # 。。。 #转义符 #\n 换行 #\\n \n #r'\\n' \n #惰性特点 量词?x 少匹配 #贪婪匹配 元字符量词
作业:
# 1.hashilib 模块 写函数 检验两个文件是否内容相同 #如果这两个文件很大(可能生成器) #2 . hashlib 做一个密文存储密码的注册 登录程序 #3 . 拼手气发红包 发多少钱 多少个 随机数 #200 50 150 第二个人为0 #每一个取多少钱 概率是相同的 #4 os 模块 (9期师兄面试原题)(可能递归) #1.这个文件夹里都是文件 #2.这个文件夹里很多文件夹 # 考文件夹的总大小 #5.计算当前月的1号的时间戳时间