正则表达式
什么是正则表达式
一套规则——匹配字符串
能做什么
1.检测一个输入的字符串是否合法——web开发 表单验证
- 用户输入一个内容的时候,我们要提前做检测
- 能够提高程序的效率并且减轻服务器的压力
2.从一个大文件中找到所有符合规则的内容——日志分析\爬虫
- 能够高效的从一大段文字中快速找到符合条件的内容
正则规则
所有的规则中的字符就可以刚好匹配到字符串中的内容
- 固定匹配 , 直接用引号 ’‘ ,内部的内容即为必须匹配上的
- 将文本中符合匹配到的第一个字符串
【abc】表示 匹配a或者b或者c
【0-9】表示匹配0123456789的任意一个数字
根据ascii进行范围的比对
元字符
在正则表达式中能够帮助我们表示匹配的内容的符号
都叫正则中的元字符
-
[] 表示仅匹配框中的一个内容,
-
[123] -> 匹配1或2或3
-
[-] -> 一般用于表示区间范围,如下
-
[0-9] -> \d 表示匹配任意数字
-
[a-zA-Z] -> 表示匹配大小写
-
[0-9a-zA-z_] -> \w 表示匹配数字字母下划线
-
‘q[34]’ -> 表示匹配q3或q4
-
空白键(空格\tab\enter) -> ( \t\n) -> \s 匹配所有空白
-
\W -> 非数字字母下划线
-
\D -> 非数字
-
\S -> 非空白
-
[\d\D] -> 表示匹配所有 同理[\w\W]等
-
. -> 通配符 匹配除了 换行符外 的所有
-
[^] 非字符,必须写在第一个位置
例:
[^\d]
-> 表示匹配非数字的字符 -
^ -> 匹配一个字符串的开始
-
$ -> 匹配一个字符串的结尾
^ 与 $ 约束了在这之间所有的内容与位数,
例:
^a. 只能匹配以 a + .任意的字符串, absdfsdf
a.$ 只能匹配以a + . 的结尾, asdfhkjav
^aaa$ :只能匹配一个字符串且必为 aaa
-
\ . -> 表示取消 . 的匹配所有的意义
用于匹配网站网址 例
www\.baidu\.com
量词
描述同一个规则匹配多少次
注意量词只能跟在元字符后面,并且只能约束前面的一个元字符
{n} 表示必须匹配n次
{n, } 表示至少匹配n次
{n, m} 表示至少匹配n次,最多匹配m次
? 表示匹配0次或1次
+
表示匹配1次或多次
*
表示匹配0次或多次
举例理解:
整数: \d+
浮点数: \d+.\d+
整数或者小数: \d+\.?\d*
- 存在缺陷 例如1.也可被匹配上
- 分组的用法:
\d+(\.\d+)?
练习:
-
匹配手机号码
1[3-9]\d{9}
-
判断用户输入的内容是否合法,如果输入的正确就能查到结果,输入不正确就不能查到
^1[3-9]\d{9}$
-
从一个大文件中找到所有符合规则的内容
1[3-9]\d{9}
分组
-
划分数据提取区域
s = 'sfasdf4asdfhjj33' res = re.findall('df(4\w{6})', s) print(res) # [(4asdfhj)] # 例:查找所有姓江的人名 re.findall('(江\w{2, 3})')
s = 'sfasdf4asdfhjj33' res = re.findall('(df(4\w{6}))', s) print(res) # [('df4asdfhj', '4asdfhj')] # 例:匹配出生年月日 s = 'sdasdfasdsdafas20030812' res = re.findall('((\d{4})(\d{2})(\d{2}))') print(res) # [('20030812', '2003', '08', '12')]
-
获取指定区域 或 的条件
- | -> 表示或 ac|bd 可以匹配 ac 可以匹配 bd缺陷:ab|abc 就只能匹配 ab
解决方法:如果匹配的内容有重叠的部分的话,总是把长的内容放在前面 即 abc|ab
()约束某个元字符的作用范围例如 ’|‘ 只在括号内生效
例: www\.(baidu|jd|bilibili)\.com
贪婪匹配
在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
匹配条件为 \d{3, 9}6 匹配 33366222262222
惰性匹配
在量词的后面加上?就变成惰性匹配
\d{3, 9}?6 3336 6222262222
描述:
.*x 表示匹配任意字符,任意多次,遇到最后一个x才停下来
.*?x 表示匹配任意字符,任意多次,一旦遇到x就停下来
转义符
-
原本有特殊意义的字符,到了需要表达它本身意义的时候,需要转义
-
有一些有特殊意义的内容,放在字符组中,会取消它的特殊意义
[.()|+?*]