day15-re与正则表达式
一、正则表达式
二、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与正则表达式相关推荐
- Python学习:day21正则表达式
写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...
- Python学习:day20正则表达式
写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...
- Python学习笔记--day15 内置模块和开发规范
day15 内置模块和开发规范 内置模块 json time datetime re 开发规范 主文件 配置文件 数据 附件 业务代码 1. 内置模块 1.1 json json模块,是python内 ...
- day15 内置模块和开发规范
day15 内置模块和开发规范 版权声明:本博客转载自路飞学城Python全栈开发培训课件,仅用于学习之用,严禁用于商业用途,未经授权,严禁转载. 欢迎访问路飞学城官网:https://www.luf ...
- 模块二 day15 内置模块和开发规范
day15 内置模块和开发规范 目标:掌握常见的内置模块的使用及了解软件开发的规范. 今日概要: 内置模块 json time datetime re 开发规范 主文件 配置文件 数据 附件 业务代码 ...
- Day15 内置和开发规范
day15 内置模块和开发规范 目标:掌握常见的内置模块的使用及了解软件开发的规范. 今日概要: 内置模块 json time datetime re 开发规范 主文件 配置文件 数据 附件 业务代码 ...
- 轩小陌的Python笔记-day15 内置模块(剩余)和开发规范
day15 内置模块和开发规范 目标:掌握常见的内置模块的使用及了解软件开发的规范. 今日概要: 内置模块 json time datetime re 开发规范 主文件 配置文件 数据 附件 业务代码 ...
- 通过正则表达式校验手机号码,拿走即用!
校验手机号码 2021/01/06更新,电信新增了191号段 1. 单纯校验长度 2.正则表达式校验数字 3.正则表达式校验是否是大陆号码 4.正则表达式校验是否是香港号码 //校验长度private ...
- Linux shell 学习笔记(15)— shell 正则表达式
1. 定义 BRE 模式 1.1 纯文本 第一条原则就是:正则表达式模式都区分大小写.这意味着它们只会匹配大小写也相符的模式. $ echo "This is a test" | ...
- re2正则表达式匹配引擎的c接口版本cre2的中文使用手册
前言 re2 官方地址: https://github.com/google/re2 cre2 官方地址: https://github.com/marcomaggi/cre2 1 基本类型定义 不透 ...
最新文章
- Google在中国打败百度的方法其实很简单.只要需改变5点.
- 算法---------二叉树的后序遍历
- 用鸽 计算机教案,科学活动教案:鸽子
- 【codeforces 796A】Buying A House
- 产品管理:启示录 - 特约客户、产品验证、原型测试
- 防风网-挡风抑尘墙:挡风抑尘墙
- 对于目前流行的量化投资与smart beta策略的一些看法
- c语言跑酷小游戏代码,跑酷游戏代码
- uipath数据爬取(结构化数据)
- Unity SRP自定义渲染管线学习1.1:初步搭建
- 本地化ASP.NET core模型绑定错误消息
- 蓝桥杯-决赛A组第九届java
- Mac 下修改文件的 md5 值
- python写android的App(kivy框架)的实践(1)
- 界面美化 —— 布局
- CC00007.CloudOpenStack——|OpenStack组件.V02|——|openstack-keystone|controller节点下部署Key
- 阿里巴巴技术委员会主席王坚眼中的人工智能
- 瓶子破碎的最高安全楼层
- IPhone 6 死机
- 视频教程-Access2013数据库入门教程3查询部分-MySQL