python全栈开发day16-正则表达式和re模块
1.昨日内容回顾
2.正则表达式(re模块是python中和正则表达式相关的模块)
1.作用
1)、输入字符串是否符合匹配条件
2)、从大段文字中匹配出符合条件的内容
2.字符组
[0-9a-zA-Z]
3.元字符(匹配个数1个)
. # 匹配除换行符以外的任意字符
\w # 匹配字母、数字、下划线
\s # 匹配空格、回车符(\n)、制表符(\t)
\d #匹配数字
\W #匹配非字母、数字、下划线
\S # 匹配非空格、回车符(\n)、制表符(\t)
\D # 匹配非数字
\n # 匹配换行符
\t # 匹配制表符
\b #匹配单词的结尾 例:\bh(以‘h’为开头),h\b(以‘h’为结尾)
ab|a #匹配ab或a,注长的放在前边。
[...] #匹配字符组中的字符
[^...] #匹配除字符组中字符以外的所有字符
^ #匹配字符串的开头^a
$ #匹配字符串的结尾a$
4.量词
* #重复0次或更多次
+ #重复0次或更多次
? # 重复0次或1次
{n} # 重复n次
{n,} #重复n次或更改次
{n,m} #重复n次至m次
5.其他
1)、 . ^ $
正则 |
待匹配字符 |
匹配 |
说明 |
李[杰莲英二棍子]* |
李杰和李莲英和李二棍子 |
李杰 |
表示匹配"李"字后面[杰莲英二棍子]的字符任意次 |
李[^和]* |
李杰和李莲英和李二棍子 |
李杰 |
表示匹配一个不是"和"的字符任意次 |
2)、 * + ? { }
3)、 分组 ()与 或 |[][^] #匹配15或18位(含x)例子
ret = re.findall('[1-9]\d{14}(?:\d{2}[0-9x])?$', '34939489495854966234')
print(ret)
4)、 转义符 \
在python中,无论是正则表达式,还是待匹配内容,都是字符串的形式出现,但是字符串中的\也有特殊含义,本身需要转义.所以我们要匹配一次"\d",我们需要写成‘\\d’,
正则表达式中要写成‘\\\\d’,看着不舒服,写着也不方便,在python中表示待匹配的‘\d’写成r‘\d’,在正则中写成r‘\\d’。
5)、 贪婪匹配和惰性匹配
贪婪匹配:在满足匹配时,会匹配尽可能长的的字符串,默认采用的是贪婪匹配。
惰性匹配(?):例子.*?x,取前面任意长的字符串,直至出现x
正则 |
待匹配字符 |
匹配 |
说明 |
<.*> |
<script>...<script> |
<script>...<script> |
默认为贪婪匹配模式,会匹配尽量长的字符串 |
<.*?> |
r'\d' |
<script> |
加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串 |
3.re模块
常用方法:
1.re.findall(‘a’,‘abca’,flag=0)
# 返回所有满足匹配条件的结果,放到列表里
2.re.search(,)
#函数会在字符串内查找模式匹配,只要找到第一个匹配就会返回包含匹配信息的对象,该对象可以通过.group()方法取回匹配的字符串,如没有匹配返回None。
ret = re.search('a', 'eva egon yuan').group()
print(ret) #结果 : 'a'
3.re.match(,)
# 和search基本相同,不过他仅在待匹配字符串开头匹配
ret = re.match('ab', 'abcd').group()
print(ret)
4.re.split(’[ab]‘,'abcd')
# 按[ab]的元素进行依次分割,得到列表
ret = re.split('[ab]','abcd')
print(ret)
运行结果:['', '', 'cd']
正则表达式部分加上()和不加得出结果是不同的,加上()保留了所匹配到的项,而不加()没有保留所匹配到的项目
ret = re.split('(ab)','abcd')
print(ret)
''' ['',
'','ab', 'cd'] '''
5.re.finditer()
# 返回一个存放匹配结果的迭代器。
6.sub subn
7.编译:compile
ret =
re.finditer('\d+','d123dd22ss2343')
print(ret)
print(next(ret).group())
for i in ret:
print(i.group())
'''
<callable_iterator object at 0x000000000075DD30>
123
22
2343
'''
两个注意点:
1 findall的优先级查询:#findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
ret
= re.findall('www.(baidu|cnblogs).com', 'www.baidu.com,www.cnblogs.com')
print(ret) #
含组 会优先返回组内匹配内容,显示全部匹配内容:
ret = re.findall('www.(?:baidu|cnblogs).com', 'www.baidu.com,www.cnblogs.com')
print(ret)
'''
['baidu', 'cnblogs']
['www.baidu.com', 'www.cnblogs.com']
'''
2 split的优先级查询:加()会会在结果列表中保留匹配的项
ret=re.split("\d+","eva3egon4yuan") print(ret) #结果 : ['eva', 'egon', 'yuan'] ret=re.split("(\d+)","eva3egon4yuan") print(ret)
#结果
: ['eva', '3', 'egon', '4', 'yuan'] #在匹配部分加上()之 后所切出的结果是不同的, #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项, #这个在某些需要保留匹配部分的使用过程是非常重要的。
3 ?号的4种用法:
1)、量词:重复0次或一次
2)、惰性匹配:
3)、分组标识:定义(?P<name> 正则表达式) 使用的时候:(?P=name)
4)、findall和split中:取消分组优先级
4.综合练习和扩展
1.匹配标签:
标签匹配的两种方式:
1)、利用组名:
ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
print(ret.group())
2)、利用组号:
ret = re.search("<(\w+)>\w+</\\1>","<h1>hello</h1>")
print(ret.group())
3)、练习
@@@123@@@
###123###
'@@@123@@@'
'###123###'
ret = re.search('(?P<tag_name>.+)\w+(?P=tag_name)', '@@123@@@')
print(ret.group())
2.匹配整数
View
Code
3.数字匹配
# 1、 匹配一段文本中的每行的邮箱
#
http://blog.csdn.net/make164492212/article/details/51656638
#
# 2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’;
ret = re.search('[1-2]\d{3}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2][0-9]|[3][0-1])', '1990-1-1')
print(ret.group())
#
# 分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、
# 一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$
#
# 3、 匹配qq号。(腾讯QQ号从10000开始) [1,9][0,9]{4,}
#
# 4、 匹配一个浮点数。
^(-?\d+)(\.\d+)?$ 或者 -?\d+\.?\d*
#
# 5、 匹配汉字。
^[\u4e00-\u9fa5]{0,}$
ret = re.findall('^[\u4e00-\u9fa5]','中国人民共和国ss')
print(ret)
#
# 6、 匹配出所有整数
4.爬虫练习
5.作业题,计算器
实现能计算类似
1 - 2 *
( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/
(16-3*2) )等类似公式的计算器程序
5.collections模块:
1、namedtuple # 生成可以用名字来访问的元素内容的元组(不能改)
2、deque # 双端队列 可以快速的从另一侧追加和删除元素
3、OrderedDict #
有序字典
4、defaultdict #
带默认值的字典
5、Counter # 计数器 主要用来计数。
python全栈开发day16-正则表达式和re模块的更多相关文章
- python全栈开发之正则表达式和python的re模块
正则表达式和python的re模块 python全栈开发,正则表达式,re模块 一 正则表达式 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的 ...
- python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)
一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...
- python 全栈开发,Day28(复习,os模块,导入模块import和from)
一.复习 collections 增加了一些扩展数据类型 :namedtuple orderdict defaltdict队列和栈time 时间 三种格式 : 时间戳 结构化 字符串random 随机 ...
- python全栈开发_day15_函数回调和模块
一:函数回调 def a(fn=None): print("run1") if fn: fn() print("run 2") def b(): print(& ...
- python全栈开发学习_内容目录及链接
python全栈开发学习_day1_计算机五大组成部分及操作系统 python全栈开发学习_day2_语言种类及变量 python全栈开发_day3_数据类型,输入输出及运算符 python全栈开发_ ...
- python全栈开发中级班全程笔记(第二模块、第四章(三、re 正则表达式))
python全栈开发笔记第二模块 第四章 :常用模块(第三部分) 一.正则表达式的作用与方法 正则表达式是什么呢?一个问题带来正则表达式的重要性和作用 有一个需求 : 从文件中读取所有联 ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- Python全栈开发【基础四】
Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...
随机推荐
- Linux之Ubuntu下如何查看已安装的软件/库文件【摘抄】
本文属于实用性质,且属于摘抄别处,出自:[Ubuntu 下如何查看已安装的软件](http://blog.csdn.net/m1205979825/article/details/40855583) ...
- html5移动端页面分辨率设置及相应字体大小设置的靠谱使用方式
对于html5移动端网页编写CSS网上有很多介绍的文章,但在实际使用过程中还是会纠结. 网上的资料太多,且大多都是技术介绍型,特别是针对android上,网上写的各种麻烦,各种复杂,各种不接地气儿.. ...
- JQuery中的$.getScript()、$.getJson()和$.ajax()方法
$.getScript() 有时候,在页面初次加载时就取得所需的全部JavaScript文件是完全没有必要的.虽然可以在需要哪个JavaScript文件时,动态地创建<script>标签, ...
- freeRTOS中文实用教程6--错误排查
1.前言 本章主要是为刚接触FreeRTOS 的用户指出那些新手通常容易遇到的问题.这里把最主要的篇幅放在栈溢出以及栈溢出侦测上 2.printf-stdarg.c 当调用标准C 库函数时,栈空间使用 ...
- git入门与实践【转】
转自:http://www.cnblogs.com/shenhaocn/archive/2011/03/13/1982957.html 什么是版本控制 要了解什么是git,首先需要了解什么是版本控制( ...
- nodejs async series 小白向
async.series({ flag1:function(done){ //flag1 是一个流程标识,用户自定义 //逻辑处理 done(null,"返回结果&qu ...
- java linux ftp问题
java写的ftp上传类,本地测试环境可以用,阿里云服务器不可用,两者系统均为centos.经过测试,发现appche的ftpclient类不可用,换成sun的ftpclient可以使用.
- CentOS 6.5下的lamp环境rsyslog+MySQL+loganalyzer实现日志集中分析管理
前言 rsyslog系统日志,在CentOS5上叫syslog,而在CentOS6上叫rsyslog,是增强版的syslog,CentOS5上的配置文件在/etc/syslog.conf下,而Cent ...
- [java]用md5来判断两个文件是否完全相同
1. 前言 由于相比较两张图片是否是相同,如果通过像素点比较感觉速度比较慢,当很多图片进行比较时,效率就低很多了.由于每个文件md5基本上是唯一的,所以用获取文件的md5来判断是否相同文件. 2. 代 ...
- HashMap Hashtable LinkedHashMap 和TreeMap
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复.Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的 ...