今日内容详细

正则表达式

老程序员告诉我们,没有正则表达式就像地狱一般,有了正则表达式我们就像进了天堂一样

开端

先让我们尝试仿写一个京东注册页面获取手机号的功能吧~

# 仿京东注册页面获取手机号
有很多校验规则
必须是11位的纯数字 并且必须是常规的手机号开头(13,15,17,18,19) '''python实现手机校验功能''' # 1.获取用户的手机号
phone_num = input('请输入您的手机号>>>:').strip()
# 2.先校验是否是11位
if len(phone_num) == 11:
# 3.再校验是否是纯数字
if phone_num.isdigit():
# 4.校验开头是否合法(随便写几个意思一下)
if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith(
'17') or phone_num.startswith('18'):
print('是一个正常的手机号')
else:
print('手机号开头不合法')
else:
print('手机号必须是纯数字')
else:
print('手机号必须是11位')

一个看似小小的获取手机号的功能,却要写那么多的代码。有没有什么简便的方法呢?

这样说,那肯定是有啦。现在让我们来学习这个方法所用到的知识吧

概念及相关符号

利用一些 '特殊符号' 的组合去字符串中筛选出想要的数据,这就是正则表达式

"""
正则表达式是一门独立的语言。专门用来匹配、校验、筛查所需的数据
任何编程语言都可以使用,在python中如果想用就必须借助于内置模块re
"""

正则表达式之字符组

在线测试网站:http://tool.chinaz.com/regex/

'''单个字符组默认一次只匹配一个字符'''
字符组 作用
[0123456789] 匹配0到9之间的任意一个数字
[0-9] 匹配0到9之间的任意一个数字(简写)
[a-z] 匹配a到z之间的任意一个小写字母
[A-Z] 匹配A到Z之间的任意一个大写字母
[0-9a-zA-Z] 匹配任意一个数字或者大小写字母(没有顺序)
'''在匹配筛选查找数据的时候可以使用正则提供的符号也可以直接写目标数据'''

正则表达式之特殊符号

符号 作用
. 匹配除换行符以外的任意字符
\w 匹配数字、字母、下划线
\d 匹配任意的数字
\t 匹配一个制表符(tab键)
^ 匹配字符串的开始 (eg:^9 找9并且这个9必须在开头)
$ 匹配字符串的结尾 (eg:9$ 找9并且这个9必须在末尾)
\W 匹配非字母或数字或下划线
\D 匹配非数字
a|b 匹配a或者b 管道符就是or(或)的意思
() 给正则表达式分组 不影响正则匹配
[] 字符组的概念(里面所有的数据都是或的关系)
[^] 上箭号出现在了中括号的里面意思是取反操作

正则表达式之量词

"""量词必须跟在表达式的后面 不能单独使用 目的是增加匹配的字符数"""
# 需要注意的是 量词默认都是贪婪匹配(即 尽可能多的匹配)
符号 作用
* 重复零次或者多次 (默认就是多次:越多越好)
+ 重复一次或者多次 (默认就是多次:越多越好)
? 重复零次或者一次 (默认就是一次:越多越好)
{n} 重复n次
{n,} 重复最少n次最多多次 (越多越好)
{n,m} 重复n到m次 (越多越好)

小试牛刀

趁热打铁

# 表达式			   文本				 结果
海. 海燕海娇海东 3条
^海. 海燕海娇海东 1条
海.$ 海燕海娇海东 1条 李.? 李杰和李莲英和李二棍子 3条
李.* 李杰和李莲英和李二棍子 1条
李.+ 李杰和李莲英和李二棍子 1条
李.{1,2} 李杰和李莲英和李二棍子 3条 李[杰莲英二棍子]* 李杰和李莲英和李二棍子 3条
李[^和]* 李杰和李莲英和李二棍子 3条 \d+ 456bdha3 2条

实现手机号码校验功能

学到这里之后,我们就能够尝试用正则表达式写出开始时的那个 获取手机号 的功能啦

# 使用正则表达式实现手机号码校验功能

import re
phone_number = input('please input your phone number : ').strip()
if re.match('^(13|14|15|18)[0-9]{9}$', phone_number):
print('是合法的手机号码')
else:
print('不是合法的手机号码')

复杂正则的编写

校验用户身份证号码

# 身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部由数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x

 ^[1-9][0-9]{14}
^[1-9][0-9]{16}[0-9x]

校验邮箱、快递单号、座机号...

"""很多常见的正则校验符号 不需要我们编写 直接百度查找即可"""
ps:百度的前提是自己能够看懂别人写的大致意思 ^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$

取消转义

\n				\n	 False

\\n				\n	 True

\\\\n			\\n	 True

在python中还可以在字符串的前面加r取消转义 更加方便

贪婪匹配与非贪婪匹配

贪婪非贪婪通常都是利用左右两边的条件作为筛选依据

# 正则          待匹配的文本                结果
<.*> <script>alert(123)<script> 1条 # 以最后一个大括号的出现作为结束标志--贪婪匹配
<.*?> <script>alert(123)<script> 2条 # 以第一个大括号的出现作为结束标志--非贪婪匹配
'''量词默认都是贪婪匹配 如果想修改为非贪婪匹配 只需要在量词的后面加 ? 即可'''

re模块

在python中无法直接使用正则 需要借助于模块

分有:内置的re模块 和 第三方的其他模块

findall(正则表达式,待匹配的文本)

结果是所有符合条件的数据 并且组织成了列表

import re

res = re.findall('a', 'jason oscar aaa')  # findall(正则表达式,待匹配的文本)
print(res) # ['a', 'a', 'a', 'a', 'a'] # 结果是所有符合条件的数据 并且组织成了列表

search(正则表达式,待匹配的文本)

查找到一个符合条件的数据就结束,没有则返回None

import re

res1 = re.search('a', 'jason oscar aaa')  #
print(res1) # 查找到一个符合条件的数据就结束 没有则返回None
print(res1.group()) # a 没有则无法调用group() 直接报错

match(正则表达式,待匹配的文本)

从字符串的开头匹配,如果没有则直接返回None,类似于给正则自动加了^,如果符合也只获取一个就结束

import re

res2 = re.match('j', 'jason oscar aaa')  # match(正则表达式,待匹配的文本)
print(res2) # None 从字符串的开头匹配 如果没有则直接返回None 类似于给正则自动加了^ 如果符合也只获取一个就结束
print(res2.group()) # j 没有则无法调用group() 直接报错

finditer(正则表达式,待匹配的文本)

结果是一个迭代器对象,为了节省空间

import re

res3 = re.finditer('a', 'jason oscar aaa')  #
print(res3) # 结果是一个迭代器对象 为了节省空间
print([obj.group() for obj in res3]) # ['a', 'a', 'a', 'a', 'a']

compile(正则表达式)

提前写好后续需要经常使用的正则,写一遍之后,直接反复调用即可

import re

obj = re.compile('\d+')  # 提前写好后续需要经常使用的正则
print(re.findall(obj,'asjd21hj13123j')) # 写一遍之后 直接反复调用即可
print(re.findall(obj,'234328748hgjghj')) # 写一遍之后 直接反复调用即可
print(re.findall(obj,'jhjhjh423432423')) # 写一遍之后 直接反复调用即可

python学习-Day19的更多相关文章

  1. python学习 day19 configparser模块 os模块 subprocess模块

    上周五回顾 logging 用于记录日志 四种核心角色: 生成器Logger 过滤器Filter 处理器Handler 格式化处理器 Formatter logging.info.debug 使用默认 ...

  2. python学习day19 面向对象(一)封装/多态/继承

    面向对象 封装思想:将同一类的函数函数封装到同一个py文件中,方便调用 面向对象也有封装的作用,将同一类的函数封装到一个类中 多态(鸭子模型):多种类型/多种形态 #,什么事鸭子模型 对于一个函数,p ...

  3. python学习 day19 (3月26日)----(对象组合)

    深谙:非常透彻地了解:熟悉内中情形.谙,读作‘ān’ 熟悉. 1.面向对象作用:规划了代码中的函数处理的是哪一类问题 解决了传参的问题 方便扩展 方便重用 2.类的定义和使用类当中有哪些成员 ''' ...

  4. Python学习-day19 django基础篇

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  5. python学习博客地址集合。。。

    python学习博客地址集合...   老师讲课博客目录 http://www.bootcdn.cn/bootstrap/  bootstrap cdn在线地址 http://www.cnblogs. ...

  6. python学习之旅

    python学习分类 python基础    +- day01——python初始.变量.常量.注释.基础数据类型.输入.if day02——while.字符串格式化.运算符.编码初识 day03—— ...

  7. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  8. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  9. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

随机推荐

  1. 27.Java 飞机游戏小项目

    开篇 游戏项目基本功能开发 飞机类设计 炮弹类设计 碰撞检测设计 爆炸效果的实现 其他功能 计时功能 游戏项目基本功能开发 这里将会一步步实现游戏项目的基本功能. 使用 AWT 技术画出游戏主窗口 A ...

  2. 『忘了再学』Shell基础 — 5、Bash基本功能(命令的别名和常用快捷键)

    目录 1.给命令设置别名 (1)设置别名的命令格式 (2)命令别名永久生效 (3)别名的优先级 2.Bash常用快捷键 1.给命令设置别名 Linux系统的命令别名我们之前已经说过了,这里再过一边. ...

  3. hanoi(老汉诺塔问题新思维)

    #include <stdio.h> //第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔 int i=1;//记录步数 void move(int n, char from,cha ...

  4. React算法复杂度优化?

    react树对比是按照层级去对比的, 他会给树编号0,1,2,3,4.... 然后相同的编号进行比较.所以复杂度是n,这个好理解. 关键是传统diff的复杂度是怎么算的?传统的diff需要出了上面的比 ...

  5. 什么是Java序列化,如何实现Java序列化?或者请解释Serializable接口的作用?

    象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象,对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上,通过网络将这种二进制流传输到另 ...

  6. 实现一个函数功能:sum(1,2,3,4..n)转化为 sum(1)(2)(3)(4)…(n)?

    // 使用柯里化 + 递归function curry ( fn ) {  var c = (...arg) => (fn.length === arg.length) ?           ...

  7. 为什么 char 数组比 Java 中的 String 更适合存储密码?

    另一个基于 String 的棘手 Java 问题,相信我只有很少的 Java 程序员可以正确回答这个问题.这是一个真正艰难的核心Java面试问题,并且需要对 String 的扎实知识才能回答这个问题. ...

  8. phpstorm+xdebug调试详细教程

    对于PHP开发,初来咋到,开发环境的搭建和理解感觉是最烦人的一件事了.不像JAVA,打开一个Eclipse就可以开搞,Php的Debug都要几个插件来配合工作.这些都是死的,好说.但是对于Xdebug ...

  9. 如何在自定义端口上运行 Spring Boot 应用程序?

    为了在自定义端口上运行 Spring Boot 应用程序,您可以在 application.properties 中指定端口. server.port = 8090

  10. Redis缓存穿透、缓存雪崩、缓存击穿

    缓存穿透: ​ 缓存穿透,是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存.如果 ...