Python自学之路---Day13
Python自学之路---Day13
常用的三个方法
1.re.match(pattern, string, flags=0)
2.re.search(pattern, string, flags=0)
3.re.findall(pattern, string, flags=0)
原型 | re.match(pattern, string, flags=0) |
---|---|
参数 | pattern:匹配的正则表达式 string :要匹配的字符串 flags :标志位,用于控制正则表达式的匹配方式 |
功能 | 1.尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成果也会返回None 2.扫描整个字符串,并返回第一个匹配成功的字符串 3.扫描整个字符串,并返回所有匹配成果的结果列表 |
flags参数说明:
re.I | 忽略大小写 |
---|---|
re.L | 做本地化识别 |
re.M | 多行匹配,影响^和$ |
re.S | 使.匹配包括换行符在内的所有字符 |
re.U | 根据Unicode字符集解析字符,影响\w \W \b \B |
re.X | 使我们以更灵活的格式理解正则表达式 |
# re.match()
str1 = "www.baidu.com"
print(re.match("www", str1))
print(re.match("baidu", str1))
# 输出
<re.Match object; span=(0, 3), match='www'>
None
# re.search()
str1 = "www.baidu.com"
print(re.search("www", str1))
print(re.search("baidu", str1))
# 输出
<re.Match object; span=(0, 3), match='www'>
<re.Match object; span=(4, 9), match='baidu'>
# re.findall()
str1 = "www.baidu.com, www.baidu.com"
print(re.findall("www", str1))
print(re.findall("baidu", str1))
# 输出
['www', 'www']
['baidu', 'baidu']
匹配单个字符
. | 匹配除换行符以外的任意字符 |
---|---|
[a, b , c] | 匹配 ‘a’ 或 ‘b’ 或 ‘c’ |
[^…] | 匹配不在[ ]内的字符, 如[ ^abc]表示匹配除了’a’ ,‘b’, ‘c’ 这个三个字符以外的任意一个字符 |
[…-…] | 匹配[从-到]的内容,如[1-9] 表示匹配数字1到9 |
\ | 反斜杠后面跟 元字符 去除 元字符的特殊功能,反斜杠后面跟 普通字符 实现 特殊功能 |
\d | 匹配所有数字,类似[0-9] |
\D | 匹配非数字字符 |
\w | 匹配数字,字母和下划线,类似[0-9a-zA-Z_] |
\W | 匹配非数字,字母和下划线,类似[ ^0-9a-zA-Z_] |
\s | 匹配任意的空白符(空格,换行,换页,制表,回车),类似[ \f\n\r\t] |
\S | 匹配任意的非空白符(空格,换行,换页,制表,回车),类似[^ \f\n\r\t] |
print(re.findall("goo.", "good man dool man goom"))
print(re.findall("[abc]", "www.baidu.com"))
print(re.findall("[^abc]", "www.baidu.com"))
print(re.findall("[0-9]", "25se26d1s5e"))
print(re.findall("[0123456789]", "25se26d1s5e"))
print(re.findall("\d", "25se26**d1s5e"))
print(re.findall("\D", "25se26**d1s5e"))
print(re.findall("\w", "25se26**d1s5e"))
print(re.findall("\W", "25se26**d1s5e"))
#输出
['good', 'goom']
['b', 'a', 'c']
['w', 'w', 'w', '.', 'i', 'd', 'u', '.', 'o', 'm']
['2', '5', '2', '6', '1', '5']
['2', '5', '2', '6', '1', '5']
['2', '5', '2', '6', '1', '5']
['s', 'e', 'd', 's', 'e']
['2', '5', 's', 'e', '2', '6', 'd', '1', 's', '5', 'e']
['*', '*']
边界匹配
^ | 匹配字符串的开头,与[ ]里的^不是一个意思 |
---|---|
$ | 匹配字符串的结尾 |
\A | 匹配字符串开头,和^的区别是它只匹配整个字符串的开头,即使在re.M模式下也不会匹配其他行的行首 |
\Z | 匹配字符串结尾,和$的区别是它只匹配整个字符串的结尾,即使在re.M模式下也不会匹配其他行的结尾 |
\b | 匹配\w作为边界的内容 |
\B | 匹配非\w与\W之间的内容 |
print(re.search("^www", "www.baidu.com")) # ^
print(re.search("^www", "w.baidu.com"))
print(re.search("com$", "www.baidu.com")) # $
print(re.search("com$", "www.baidu.comm"))
print(re.search("ww\w", "www.baidu.com")) # \b
print(re.search("www\w", "www.baidu.com"))
print(re.search("www\W", "www.baidu.com")) # \B
print(re.search("www.\W", "www.baidu.com"))
# 输出
<re.Match object; span=(0, 3), match='www'>
None
<re.Match object; span=(10, 13), match='com'>
None
<re.Match object; span=(0, 3), match='www'>
None
<re.Match object; span=(0, 4), match='www.'>
None
数量匹配
* | 匹配前一个字符0次或无限次(贪婪) |
---|---|
+ | 匹配前一个字符1次或无限次(贪婪) |
? | 匹配前一个字符0次或1次(非贪婪) |
{m} | 匹配前一个字符m次 |
{m,n} | 匹配前一个字符m至n次。m,n可以省略,若省略m,则匹配0至n次;若省略n则匹配m至无限次(贪婪) |
*?+?{m,n}? | 可以使使其变为非贪婪匹配 |
print(re.findall("a*", "abaaa")) # *
print(re.findall("a+", "abaaa")) # +
print(re.findall("a?", "abaaa")) # ?
print(re.search("a{2}", "abaaa")) # {m}
print(re.search("a{2,4}", "abaaa")) # {m,n}
print(re.search("a{2,4}?", "abaaa")) # {m,n}?
# 输出
['a', '', 'aaa', '']
['a', 'aaa']
['a', '', 'a', 'a', 'a', '']
<re.Match object; span=(2, 4), match='aa'>
<re.Match object; span=(2, 5), match='aaa'>
<re.Match object; span=(2, 4), match='aa'>
逻辑与分组
| | 匹配左右表达式的任意一个,如果|没有被包括在()内,则它的范围是整个表达式 |
---|---|
(...) | 被括起来的表达式将作为一个分组,从表达式左边开始每遇到一个左括号,编号+1.分组表达式作为一个整体,后面可以接数量词。表达式中的|仅在该组中有效 |
(?P...) | 指定组的别名 |
print(re.search("www.baidu.com|WWW.BAIDU.COM", "www.baidu.com")) # |
print(re.search("www.baidu.com|WWW.BAIDU.COM", "WWW.BAIDU.COM"))
print(re.search("(w|W)ww.baidu.com", "www.baidu.com")) # ()
print(re.search("(w|W)ww.baidu.com", "Www.baidu.com"))
m = re.match(r"(?P<first>(\d{3})-(?P<last>\d{8}))", "010-52347654") # (?P<name>)
print(m.group(0)) # 使用序号获取对应组的信息,group(0)代表原始字符串
print(m.group(1))
print(m.group(2))
print(m.group("first"))
print(m.groups()) # 查看匹配的各组的情况
# 输出
<re.Match object; span=(0, 13), match='www.baidu.com'>
<re.Match object; span=(0, 13), match='WWW.BAIDU.COM'>
<re.Match object; span=(0, 13), match='www.baidu.com'>
<re.Match object; span=(0, 13), match='Www.baidu.com'>
010-52347654
010-52347654
010
010-52347654
('010-52347654', '010', '52347654')
编译正则表达式
编译:当使用正则表达式时,re模块会干两件事
1.编译正则表达式,如果正则表达式本身不合法会报错
2.用编译后的正则表达式去匹配对象
编译成正则对象,在调用是就会省去原来的正则表达式参数
pat = r"^1(([3578]\d)|(47))\d{8}$" # 正则表达式
print(re.match(pat, "13600000000"))
re_telephone = re.compile(pat) # 编译
print(re_telephone.match("13600000000"))
# 输出
<re.Match object; span=(0, 11), match='13600000000'>
<re.Match object; span=(0, 11), match='13600000000'>
其他方法
re.split(pattern, string, maxsplit=0, flags=0)
该方法作用类似于字符串的split()方法,但是由于加入了正则表达式,所以更好用,更精确
str1 = "sunck is a good man"
print(str1.split(" "))
print(re.split(r" +", str1))
# 输出
['sunck', '', '', '', '', '', '', '', '', 'is', 'a', 'good', 'man']
['sunck', 'is', 'a', 'good', 'man']
re.sub(pattern, repl, string, count=0, flags=0)
re.subn(pattern, repl, string, count=0, flags=0)
功能:在目标字符串中以正则表达式的规则匹配字符串,同时把他们替换成指定的字符串,默认替换次数为替换所有
区别:前者返回一个修改后的字符串,后者返回一个元组(修改后的字符串, 被替换的次数)
str3 = "www.baidu.com, www.sina.com, www.rnake.com"
print(re.sub(r"www", "ppp", str3))
print(type(re.sub(r"www", "ppp", str3)))
print(re.subn(r"www", "ppp", str3))
print(type(re.subn(r"www", "ppp", str3)))
# 输出
ppp.baidu.com, ppp.sina.com, ppp.rnake.com
<class 'str'>
('ppp.baidu.com, ppp.sina.com, ppp.rnake.com', 3)
<class 'tuple'>
Python自学之路---Day13的更多相关文章
- Python自学之路---Day01
目录 Python自学之路---Day01 注释 单行注释 多行注释 print()函数 语法 参数 实例 input()函数 语法 参数 实例 查看Python的关键字 代码 变量与常量 变量 如何 ...
- Python自学之路
2020年春节,受新型冠状病毒影响,整个春节假期,全国人民都在恐慌之中,为了避免大家上班相互传染,公司号召国家政策,开始上班日期延迟,在家呆的实在太无聊,突然感觉自己不能浪费这美好的时光,决定学习Py ...
- 我的Python自学之路-003 字符串的知识
'''字符串是以引号或者单引号括起来的任意文本,例如"123","asdfjk",'adfa'引号或者单引号,只是一种表示方法,并不是字符串的一部分如果字符串本 ...
- python 自学之路-Day Two
Day1补充部分 模块初识 模块就是由其他人写好的功能,在程序需要的时候进行导入,直接使用,也叫库. 库有标准库和第三方库,所谓标准库,就是不需要安装就可以直接使用的,自带的:第三方库,就是需要进行下 ...
- python 自学之路-Day one
一.Python介绍 创始人吉多范罗苏姆(龟叔),脚本解释程序 应用领域广,数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等. 主要应用领域: 云计算:OpenStack: WEB开发:经 ...
- Python自学之路——自定义简单装饰器
看了微信公众号推送的一道面试题,发现了闭包的问题,学习时间短,从来没有遇到过这种问题,研究一下. Python函数作用域 global:全局作用域 local:函数内部作用域 enclosing:函数 ...
- ql的python学习之路-day13
前言:本节主要学习模块 一.模块的定义 模块:本质是.py结尾的python文件(文件名:test.py,对应的模块是:test),用来从逻辑上组织python代码(变量.函数.类.逻辑,本质是实现一 ...
- 我的Python自学之路-002 字典的知识
'''字典是python中唯一的验证类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算.根据计算的结果决定value的存储地址.所以字典是无序存储的.且key必 ...
- 我的Python自学之路-001 列表的知识
#_date_:2020/9/11 '''列表和字典是python中用的最多的数据类型 假如要存储一个班级的人名,需要怎么做?有这么几种方法:1.定义很多个变量: name0 = 'wucaho' n ...
随机推荐
- JS写一个旋转木马的视频播放效果
JS以及JQ的功能很强大,可以做出很多的优秀效果.今天给大家分享一个我之前写网站用到的旋转木马效果. 大概效果图就是这样的,上面的视频播放是旋转木马效果. 下面的音乐播放效果放在下一篇内容里面讲. 直 ...
- mysql导入导出无权限
error:The MySQL server is running with the --secure-file-priv option so it cannot execute this state ...
- mysql悲观锁处理赠品库存超卖的情况
处理库存超卖的情况前,先了解下什么是乐观锁和悲观锁,下面的几篇博客已经介绍的比较详细了,我就不在赘述其原理了 [MySQL]悲观锁&乐观锁 对mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表 ...
- 项目上线后,遇到IE浏览器不显示大部分组件的问题
document.addEventListener('touchmove',(evt)=>{ }) 以上是ES6 语法,箭头函数,当然在IE下是不行的啦. 所以改为:ES5语法 document ...
- Hbase排错
1.执行MR任务报Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads():?subprocess failed with c ...
- Metasploitable学习(一)
划红线的是执行语句,对已知的服务器的IP地址进行扫描.嗅探
- C++编程学习(九)this指针&友元函数
mooc西工大魏英老师的课程通道关闭了,难受.现在边看工程代码边重温刷第一遍C++时候的知识点,顺序没有按照大纲的来,想到哪写到哪. this是干啥用的? 简介:在 C++ 中,每一个对象都能通过 t ...
- ROS大型工程学习(一) 必须了解的基本文件
一.Cmake文件 阅读工程,首先点开CMakeLists 文件,会定义一些库和可执行文件.首先看可执行文件,rosrun的就是这个节点navigator add_executable(navigat ...
- 云时代架构阅读笔记七——Java多线程中如何使用synchronized关键字
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- JavaScript.StringObjec.replace
//StringObject.replace(/regexp/,newContent); //1当newContent为新字符串,就直接用newContent对匹配的内容进行替换. //2当newCo ...