# 什么是正则表达式
# 一种匹配字符串的规则
# input 一串数据 :
# 是不是qq号码 : 全数字 5位以上 12位一下,第一位不是零
# 是不是身份证号 : 18位/15位 第一位不是零 18位的最后一位可能是x或者数字
# 有一个文件
# 要你把这个文件中所有的手机号都摘取出来
# 正则表达式能做什么
# 可以定制一个规则,
#1. 来确认某一个字符串是否符合规则
#2. 从大段的字符串中找到符合规则的内容
# 程序领域
# 1.登录注册页的表单验证 web开发 要求简单语法
# 2.爬虫
# 爬虫 把这个网页下载下来 从里面提取一些信息,找到我要的所有信息,做数据分析
# 3.自动化开发 日志分析
# 什么是正则表达式 : 一种匹配字符串的规则
# 明确一件事:
# 正则表达式是一种独立的语法
# 和python没关系
# 帮助学习的工具 http://tool.chinaz.com/regex/
# 元字符
# 字符组 []
# [^]
# 字符组 []# 在一个字符的位置上能出现的内容
# 非字符组[^] 在一个字符的位置上不能出现的内容
# [1bc] 是一个范围
# [0-9][A-Z][a-z] 匹配三个字符
# [abc0-9] 匹配一个字符
# [0-9a-zA-Z] 匹配一个字符
# d == [0-9] 也表示匹配一个字符,匹配的是一个数字 #digit
# w == [0-9a-zA-Z_] 也表示匹配一个数字字母下划线 #word
# s == [
] 包括回车 空格 和 制表符tab(tab在pycharm默认是4个空格,也可以自定义) #space
#
匹配回车
# 匹配制表符
# D 匹配非数字
# W 匹配非数字字母下滑线
# S 匹配非空白
# [dD] [wW] [sS] 匹配所有
# 匹配边界 (边界不分前后) **很少用到
# 例子: hello word
# [] h o w d 都为边界
# [o]代表o后面是边界
# [w]这个匹配不到,代表w后面是边界
# ^ 匹配字符串的开始,它只能出现在开头.
# 除非[^abc]这种情况,^代表是非的情况,表示这里可以放除了abc的任意字符,例子ha[^abc]ss
# $ 匹配字符串的结尾,它只能出现在结尾
# 例子 hello hello hello
# ^hello 只匹配开头的hello
# $hello 只匹配结尾的hello
# ^hello$ 匹配不上,只有一个hello的情况下才能匹配上.
# ^[d][d]$ 匹配2位任意开头和结尾的数字,超过两位不行
# a|b匹配字符a或字符b
# | 或的关系,只要一个匹配到另一个就不会匹配
# 如果出现了重合的情况:例子 ab|abc,必须把长度长的一方放在前面abc|ab,
# 因为它读到了ab就默认匹配到了
# . 代表可以匹配除了换行符(
回车)以外的任意字符
#. 这种转义.代表除了.其他都不行
# 量词{}
# ? + *
#结合贪婪匹配来考虑,贪婪匹配使用的是:回溯算法
# {n},{n,},{n,m}
# 特殊的用法和现象
# ?的使用
# 1. 在量词的后面跟了一个 ? 取消贪婪匹配 非贪婪(惰性)模式
# ?? *? +? {n}?
# 如果量词后面还有?表示取消贪婪匹配
# ?? +? *? 这种取消贪婪匹配
# 例子: 李莲英和李杰 李.{1,3}? 按最少的来匹配 #李莲
# 例子:李莲英和 李.{1,3}?和 在能匹配上的情况下给你匹配尽量少的 #李莲英和
# <.*>回溯算法找第一个:<一直匹配到最后,发现没有>,在往回走,找到了一个>结束
# 例子 <abc>dasdsdadad<abc>sjjkkk 结果是<abc>dasdsdadad<abc>
# 非贪婪匹配(惰性匹配):<.*?>
# 例子 <abc>dasdsdadad<abc>sjjkk 结果是<abc>
# {}只能约束前一个字符,输入{3}表示重复3次
# 例子:d{3} 123三位 , dd{3} 1111四位,相当于d{3}是一组,d是一组
# d{3,}叫贪婪匹配,表示重复至少3次 位数>3即可
#d{3,5} 至少匹配3次,最多匹配5次,能多匹配就多匹配
# ? 可以匹配也可以不匹配用?来表示 范围: 0 - 1
# d? 代表前面这个字符匹配0次或者一次
# d表示匹配一个字符,如果一个字符都没有的情况表示匹配不上,正常情况不会显示,
# 如果/d?,没匹配上也算匹配上了,匹配了1次,如果什么都不输,匹配了1次,输入一个a,匹配了2次,都没有匹配上.(/d要求数字哦)
# 例子:小知识点:假设我需要匹配2.3,4.6.8.8等等这种带小数的数据
# # d.d这样可以
# # 如果我需要这里既可以2.3也可以23那d.d这个就不行了,
# # 1. d.d|dd 第一种解决方案
# # 2. d.?d
# + 表示重复一次或多次 范围: 1- 无穷大
# d+
# * 表示既可以不匹配又可以匹配任意多次 范围 : 0 - 无穷大
# d*
# 假设有一个需求既可以是整数又可以是小数
# 2 或 2.345566778854333455
# d.?d*
# d.?d+ 这种只能匹配两位或两位以上,一位只有一个数就不行了
# 最常用 .*?x 匹配任意字符直到找到一个x
# ()分组的概念是把多个元字符,放进来变成一个元字符让量词来约束
# 匹配15或18为的身份证号
#方法一:用|来实现 ^[1-9]d{16}[0-9x]|^[1-9]d{14}
#方法二:用()分组来实现 [1-9]d{14}(d{2}[1-9X])?
#例子有一个数可能是整数可能是小数,必须存在
# d+.?d* 这种情况会出现12.也会匹配到的问题
# d+(.d+)? 这种可以完美解决上面的问题