一、正则表达式

二、re模块

1.0 正则表达式

1.1 正则表达式与re模块的关系

# 1.正则表达式是一门独立的技术,任何语言均可使用
# 2.python中要想使用正则表达式需要通过re模块

1.2 正则表达式

京东注册账号手机有校验功能:

<https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/>

1.3 有无正则校验的区别

1.3.1 纯python代码

while True:phone_number = input('input your phone number : ')if len(phone_number) == 11 \and phone_number.isdigit() \and (phone_number.startswith('13') \or phone_number.startswith('14') \or phone_number.startswith('15') \or phone_number.startswith('18')):print('是合法的手机号码')else:print('不是合法的手机号码')

1.3.2 正则表达式

import rewhile True:phone_num = input("input your phone number:>>>")if re.match('^(13|14|15|18|19)[0-9]{9}$', phone_num):print('这个合法手机')else:print('不是合法手机')

# 正则在所有语言中都可以使用 不是python独有的
# 匹配大段文本中特定的字符

1.4 正则表达式相关

# 在线测试:*http://tool.chinaz.com/regex/*(与re模块无关,仅仅是测试)# 应用场景:爬虫、数据分析# 推荐书籍:正则指引

1.5 字符组

# 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示(一个字符组每次只能匹配一个字符)
# 字符分为很多类,比如数字、字母、标点等等。
# 假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。# 匹配0-9数字([0123456789]也支持简写[0-9])(如果想匹配横杠,转义即可)
# 匹配A-Z字母(依据上面的简写规则[A-Z])
# 匹配a-z字母(依据上面的简写规则[a-z])

ps:这种上面到上面的范围必须是从小到大[a-Z]不行,[A-z]可以(但是内部有几个特殊符号),因为内部对应的asicc码A在所有字母里面最小,z在所有字母里面最大

1.6 正则表达式符号

正则
待匹配字符
匹配结果
说明
[0123456789]
8
True
在一个字符组里枚举合法的所有字符,字符组里的任意一个字符和"待匹配字符"相同都视为可以匹配
[0123456789]
a
False
由于字符组中没有"a"字符,所以不能匹配
[0-9]
7
True
也可以用-表示范围,[0-9]就和[0123456789]是一个意思
[a-z]
s
True
同样的如果要匹配所有的小写字母,直接用[a-z]就可以表示
[A-Z]
B
True
[A-Z]就表示所有的大写字母
[0-9a-fA-F]
e
True
可以匹配数字,大小写形式的a~f,用来验证十六进制字符

字符

元字符
匹配内容
匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线(word)
\s 匹配任意的空白符(space)
\d 匹配数字(digit)
\n 匹配一个换行符(line)
\t 匹配一个制表符(tab)
\b 匹配一个单词的结尾(back)
^ 匹配字符串的开始
$ 匹配字符串的结尾
\W
匹配非字母或数字或下划线
\D
匹配非数字
\S
匹配非空白符
a|b
匹配字符a或字符b
()
匹配括号内的表达式,也表示一个组
[...]
匹配字符组中的字符
[^...]
匹配除了字符组中字符的所有字符

量词:

量词
用法说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

1.6.1 了解:

# \w,\s,\d与\W,\S,\D相反的匹配关系(对应的两者结合就是匹配全局)
# \t 匹配制表符
# \b 匹配结尾的指定单词

1.6.2 掌握:

# ^:以什么什么开头
# ^[a-z]
# ^[0-9]
# $:以什么什么结尾

ps:^与$连用能够精准匹配固定长度的目标字符,^只能出现在开头(),$只能出现结尾

# |:或
# ab|abc优先匹配前面的正则表达式ab,匹配上就不再用后面的abc,可以通过调换顺序修改优先级
# ^:出现在[]中的^表示除了^后面的其他都匹配
# [^a]除了a其他都匹配
# [^a-z]除了小写字母a-z其他都匹配

上面的是匹配单个字符的符号,接下来是匹配个数的限制符号

1.6.3 量词:

# +:我想要匹配13838384388,\d一次只能匹配到一个数字,要想一次讲号码全部匹配上需要用到\d+,+表示重复一次或者多次,并且正则中默认都是贪婪匹配,越多越好
# *:匹配0次或多次
# ?:匹配0次或一次

ps:

# 1.对于这个0次也能匹配出来的结果,暂时不用考虑
# 2.*,+,?的工作区间可以用坐标轴的形式表示出来
# * {n}:明确指定个数

注意:量词需要写在匹配符号的后面,并且只约束紧挨着它的那个正则表达式

1.7 例子:

* 逐个匹配出后面的道:轨道 通道 地道 魔道 人道 # .*?道
* 匹配人名:海燕海娇海东  # 海.{1}

1.8 分组:

* 一次性匹配a1b2c3

# 用\[a-z][0-9]会匹配到三个结果# 想法:重复写三次,但是太麻烦,加量词的话只能限制离得最近的正则表达式# 这个时候就可以用分组(\[a-z][0-9])+

* 匹配身份证号

# 1.^[1-9]\d{13,16}[0-9x]$:不完善的地方在于默认是x的情况只在18位才可能出现,但是这个表达式没有做这一层的限制
# 2.^[1-9]\d{14}(\d{2}[0-9x])?$
# 3.^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
# ^([1-9][0-9]{16}[0-9X]|[1-9][0-9]{14})$

1.9 转义符:

# 通过r或者\,对\n和\s换行符等进行转义# "\n",要写成'\\\n',"\\\n",要写成'\\\\\\\\n'
# 利用r可以让整个字符串都不再转义(r就是real,真实不转义)

1.10 贪婪匹配与非贪婪匹配

#  <.*>:从字符串起始位置开始找<,然后从字符串的末尾开始找>,找到之后,把<>和里面的内容一起拿出来
#  <.*?>:从字符串起始位置开始找<,找到之后,然后接着往下找,找到离它最近的>,然后把匹配的结果返回
# .*?x:就是取前面任意长度的字符,直到一个x出现

2.0 re模块使用

2.1 三个内置方法

# findall
# search
# match

2.2 三种方法的使用

findall:

import re
name = re.findall('r', 'ryan jessic jenny ammi richard')
# 第一个参数'r'是正则表达式,第二个参数'ryan jessic jenny ammi richard'是待匹配的文本内容
print(name)
# ['r', 'r', 'r']findall就是找到全部的意思,结果是以列表的形式返回3个'r' 

search:

import re
name = re.search('r', 'ryan jessic jenny ammi richard')
print(name)
print(name.group())
# search 是搜索的意思,找到第一个相匹配的字符就会停止,然后返回一个对象的位置信息
# <re.Match object; span=(0, 1), match='r'>
# 可以通过.group()方法获得匹配的字符串
# r
name = re.search('q', 'ryan jessic jenny ammi richard')
# 如果字符串没有匹配,就返回None,此时调用.group()就会直接报错# None# AttributeError: 'NoneType' object has no attribute 'group'

if name:  # 通过name=None=False 来避免执行下面的print(ret.group())

match:

import re
name = re.match('y', 'ryan jessic jenny ammi richard')
print(name)
print(name.group())
效果同search,不过仅在字符串'开始'处进行匹配,比如'r',如果使用第二个字符'y'就会报错
# None
# AttributeError: 'NoneType' object has no attribute 'group'

2.3 其他方法的使用

.split()

import re
name = re.split('y', 'ryan jessic jenny ammi richard')
print(name)name = re.split('es', 'ryan jessic jenny ammi richard')
print(name)name = re.split('[er]', 'ryan jessic jenny ammi richard')
print(name)# ['r', 'an jessic jenn', ' ammi richard'] 用y切
# ['ryan j', 'sic jenny ammi richard'] 用es这个
# ['', 'yan j', 'ssic j', 'nny ammi ', 'icha', 'd'],用r切一遍,再用e切一遍

.sub()

import re
name = re.sub('y','520','ryan jessic jenny ammi richard')
print(name)
# r520an jessic jenn520 ammi richard  #把所有的'y'替换成'520'
import rename = re.sub('y','520','ryan jessic jenny ammi richard',1)print(name)# 最后一个'1'表示只替换第1个

.subn()

name = re.subn('a','520','ryan jessic jenny ammi richard')
print(name)
# ('ry520n jessic jenny 520mmi rich520rd', 3) 返回一个元祖,并显示一共替换了几个

.compile()

import re
res = re.compile('\d{4}')  # 匹配三个数字,存入变量中
name = res.search('041ajdsfklja328lkjfalkj3983jlj88ljdsjf')
print(name)
print(name.group())# <re.Match object; span=(23, 27), match='3983'>
# group结果:3983

.finditer()

import rename = re.finditer('\d', '041ajdsfklja328lkjfalkj3983jlj88ljdsjf')
print(name)
# 返回一个迭代器
# <callable_iterator object at 0x10c79b240>print(next(name))
# <re.Match object; span=(0, 1), match='0'>
# 查看第1个相关信息print(next(name).group())
# 查看第2个结果:4
print([i.group() for i in name])# 查看剩余的结果
 

2.4 分组优先机制

import re
res = re.search('^[1-9]\d{14}(\d{2}[0-9x])?$',110105199812067023)
print(res.group())
print(res.group(1)) # 获取正则表达式括号阔起来分组的内容
print(res.group(2)) # search与match均支持获取分组内容的操作 跟正则无关是python机制# 而针对findall它没有group取值的方法,所以它默认就是分组优先获取的结果
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可

ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # ?:取消分组优先
print(ret) # ['www.oldboy.com']

2.4.2 <name>起名

import reret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")# 还可以在分组中利用?<name>的形式给分组起名字
# 获取的匹配结果可以直接用group('名字')拿到对应的值print(ret.group('tag_name')) #结果 :h1
print(ret.group()) #结果 :<h1>hello</h1># 注意?P=tag_name相当于引用之前正则表达式,并且匹配到的值必须和前面的正则表达式一模一样

2.4.3 匹配整数

ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']

ret=re.findall(r"\d+\.\d*|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '', '5', '4', '3']
ret.remove("")
print(ret) #['1', '2', '60', '5', '4', '3']

转载于:https://www.cnblogs.com/Ryan-Yuan/p/11202452.html

day15-re与正则表达式相关推荐

  1. Python学习:day21正则表达式

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...

  2. Python学习:day20正则表达式

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...

  3. Python学习笔记--day15 内置模块和开发规范

    day15 内置模块和开发规范 内置模块 json time datetime re 开发规范 主文件 配置文件 数据 附件 业务代码 1. 内置模块 1.1 json json模块,是python内 ...

  4. day15 内置模块和开发规范

    day15 内置模块和开发规范 版权声明:本博客转载自路飞学城Python全栈开发培训课件,仅用于学习之用,严禁用于商业用途,未经授权,严禁转载. 欢迎访问路飞学城官网:https://www.luf ...

  5. 模块二 day15 内置模块和开发规范

    day15 内置模块和开发规范 目标:掌握常见的内置模块的使用及了解软件开发的规范. 今日概要: 内置模块 json time datetime re 开发规范 主文件 配置文件 数据 附件 业务代码 ...

  6. Day15 内置和开发规范

    day15 内置模块和开发规范 目标:掌握常见的内置模块的使用及了解软件开发的规范. 今日概要: 内置模块 json time datetime re 开发规范 主文件 配置文件 数据 附件 业务代码 ...

  7. 轩小陌的Python笔记-day15 内置模块(剩余)和开发规范

    day15 内置模块和开发规范 目标:掌握常见的内置模块的使用及了解软件开发的规范. 今日概要: 内置模块 json time datetime re 开发规范 主文件 配置文件 数据 附件 业务代码 ...

  8. 通过正则表达式校验手机号码,拿走即用!

    校验手机号码 2021/01/06更新,电信新增了191号段 1. 单纯校验长度 2.正则表达式校验数字 3.正则表达式校验是否是大陆号码 4.正则表达式校验是否是香港号码 //校验长度private ...

  9. Linux shell 学习笔记(15)— shell 正则表达式

    1. 定义 BRE 模式 1.1 纯文本 第一条原则就是:正则表达式模式都区分大小写.这意味着它们只会匹配大小写也相符的模式. $ echo "This is a test" | ...

  10. re2正则表达式匹配引擎的c接口版本cre2的中文使用手册

    前言 re2 官方地址: https://github.com/google/re2 cre2 官方地址: https://github.com/marcomaggi/cre2 1 基本类型定义 不透 ...

最新文章

  1. Google在中国打败百度的方法其实很简单.只要需改变5点.
  2. 算法---------二叉树的后序遍历
  3. 用鸽 计算机教案,科学活动教案:鸽子
  4. 【codeforces 796A】Buying A House
  5. 产品管理:启示录 - 特约客户、产品验证、原型测试
  6. 防风网-挡风抑尘墙:挡风抑尘墙
  7. 对于目前流行的量化投资与smart beta策略的一些看法
  8. c语言跑酷小游戏代码,跑酷游戏代码
  9. uipath数据爬取(结构化数据)
  10. Unity SRP自定义渲染管线学习1.1:初步搭建
  11. 本地化ASP.NET core模型绑定错误消息
  12. 蓝桥杯-决赛A组第九届java
  13. Mac 下修改文件的 md5 值
  14. python写android的App(kivy框架)的实践(1)
  15. 界面美化 —— 布局
  16. CC00007.CloudOpenStack——|OpenStack组件.V02|——|openstack-keystone|controller节点下部署Key
  17. 阿里巴巴技术委员会主席王坚眼中的人工智能
  18. 瓶子破碎的最高安全楼层
  19. IPhone 6 死机
  20. 视频教程-Access2013数据库入门教程3查询部分-MySQL

热门文章

  1. 【软件】一个简单文件批量重命名工具,支持正则替换
  2. 用python编写一个掷骰子的小程序
  3. python实现:Flask_WTF表单
  4. 三台机器互相免密登录(详情版)
  5. 股票期货与金融期货(金融期货股票有哪些)
  6. 华为鸿蒙将成全球前三大系统,外媒再放狠话!华为鸿蒙将成全球前三大系统:首台鸿蒙手机也来了...
  7. 小黑leetcode之旅:86. 分隔链表
  8. DirectX修复教程
  9. win7 开发相关 软件装机
  10. wifi放大器速度_放大器的速度有多快?