正则表达式
正则表达式
1.什么是正则表达式
我们登录很多网站的时候,都会有注册账号,注册账号的时候都会要求填写手机号,填写手机号的时候有很多的要求,必须是十一位的纯数字,还不能是随便瞎写的,这是怎么实现的呢?我们来看一下:
phone_number = input('请输入你的手机号>>:').strip() if len(phone_number) == 11: if phone_number.isdigit(): if phone_number.startswith('13') or phone_number.startswith('15') or phone_number.startswith('18'): print('这是一个正常的手机号') else: print('手机号开头不对') else: print('手机号不是纯数字') else: print('手机号不是十一位')
上述代码呢就是我们做出的一个简易版本的验证手机号的功能,就是一个简单的分支结构的嵌套,但是呢,看着有一点繁杂,我们来看看用正则表达式怎么写:
import re phone_number = input('输入你的手机号>>:').strip() if re.match('^(13|15|18)[0-9]{9}$',phone_number): print('这是一个正常的手机号') else: print('这个手机号不合法')
上述代码就是用正则表达式做出来的,那什么是正则表达式呢:就是利用特殊符号的组合去字符串中做一些操作来得到自己想要的数据。正则表达式是一门独立的语言,是专门用来匹配、校验、筛查用户所需要的数据的,任何编程语言都可以使用,Python想要使用正则表达式,就需要导入内置模块re。
2.正则表达式之字符组
[0-9]:匹配0到9之间的任意一个数
[a-z]:匹配a到z之间的任意一个小写字母
[A-Z]:匹配A到Z之间的任意一个大写字母
[0-9a-zA-Z]:匹配任意一个数字和大小写字母(里面的正则表达式没有顺序要求)
注意:单个字符组默认只匹配一个字符
3.正则表达式之特殊符号
.:匹配除换行符(enter键)以外的所有字符
\w:匹配数字、字母、下划线
\d:匹配任意数字
\t:匹配一个制表符(tab键)
^:匹配字符串的开头
$:匹配字符串的结尾
\W:匹配非数字、字母、下划线
\D:匹配非数字
m|n:匹配m或者n,中间的管道符就是or(或)的意思
():给正则表达式分组,但是不影响正则表达式匹配
[]:字符组的概念,里面的数据都是"或"得关系
[^]:取反操作
注意:特殊符号默认的也是一次只匹配一个字符
4.正则表达式之量词
*:重复0次或者多次(默认是多次)
+:重复1次或者多次(默认是多次)
?:重复0次或者1次(默认是一次)
{n}:重复n次
{n,}:最少重复n次或者多次(默认是多次)
{n,m}:重复n到m次(默认是多次)
注意:量词默认的都是尽可能多的匹配(贪婪匹配)
5.贪婪匹配与非贪婪匹配
正则表达式的量词默认的都是贪婪匹配,如果想要修改为非贪婪匹配,那么只需要在量词的后面加一个"?"即可,我们来看个例子:
假如我们有一个待匹配的文本:<script>alert(123)<script>
如果我们的正则表达式是"<.*>"那么就只会产生一个结果,以最后一个括号">"为结束的标志,因为遵循的是贪婪匹配的原则。
如果我们的在上述的正则表达式的量词后面加一个"?",就是"<.*?>",遵循的是非贪婪原则,会返回两个结果,以第一个括号">"为结束的标志,然后再往下,然后结束。
6.取消转义
我们在学习文件的操作的时候,讲到了如何取消转义,就是在前面加一个"r",在正则表达式同样适用,但是呢正则表达式也有属于它自己的取消转义:
假如我们想要筛选出"\n",那么我们的正则表达式就是"\\n",假如我们想要筛选出"\\n",那么我们的正则表达式就是"\\\\n",意思就是加一条斜杠就可以取消掉斜杠的特殊意义,因为斜杠加字母会有特殊意义,那么我们取消掉斜杠的特殊意义就好了。
7.re模块
在Python中是没有办法直接使用正则的,只能调用Python解释器的内置模块re模块或者第三方模块。
(1).findall
res = re.findall('q', 'query is a query') print(res) # ['q', 'q'] 返回的是所有符号条件的数据,是一个列表
(2).search
res = re.search('q', 'query is a query') print(res) # 查找到一个符合条件的就结束,没有就返回None print(res.group()) # q 查看返回结果的关键字是group,如果没有符合条件的数据在调用group就会直接报错
(3).match
res = re.match('u', 'query is a query') print(res) # 从字符串的开头开始匹配,如果没有就返回None,如果符合也只返回一个值 print(res.group()) # 如果没有符合条件的数据在调用group就会直接报错
(4).finditer
res = re.finditer('q', 'query is a query') print(res) # 返回的是一个迭代器对象,为节省空间 print([i.group() for i in res])
(5).compile
res = re.compile('\w') # 提前定义好正则表达式,可以直接拿来使用 print(re.findall(res,'qwe34213')) # ['q', 'w', 'e', '3', '4', '2', '1', '3'] print(re.findall(res,'qwe##342_13')) # ['q', 'w', 'e', '3', '4', '2', '_', '1', '3']
这里是IT小白陆禄绯,欢迎各位大佬的指点!!!