Python语法进阶(2)- 正则表达式
1.初识正则表达式
1.1.什么是正则表达式
正则表达式是一个特殊的字符序列,便于检查一个字符串是否与某种模式匹配;应用于字符串,在字符串中通过复杂的过滤筛选等操作得到我们想要的数据;
正则表达式的特点 :
- 正则表达式的语法太多,可读性差
- 正则表达式通用行很强,能够适用于很多编程语言
1.2.正则表达式的使用场景
在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要,比如:手机号、邮箱、图片地址 等,这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式了。
1.3.正则表达式模块re的用法
匹配字符串需要的条件:
- 正则表达式模块--re
- 匹配查找的规则
- 被查找的字符串
2.正则表达式的字符匹配
1 # coding:utf-8
2
3 import re
4
5 #将字符串中的数字提取出来
6 def had_number(data):
7 result=re.findall('\d',data)
8 print(result) #['3', '3', '1', '7', '5']
9 for i in result:
10 return True
11 return False
12
13 #去掉字符串中的数字
14 def remove_number(data):
15 result=re.findall('\D',data)
16 print(result) #['m', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 'z', 'h', 'a', 'n', 'g', 's', 'a', 'n', ',', 'm', 'y', ' ', 'a', 'g', 'e', ' ', ',', 't', 'o', 'p', ' ']
17 return ''.join(result)
18
19 if __name__=='__main__':
20 data='my name is zhangsan,my age 33,top 175'
21 result=had_number(data)
22 print(result) #True
23 result=remove_number(data)
24 print(result) #my name is zhangsan,my age ,top1 # coding:utf-8
2
3 import re
4
5 #判断字符串以什么开头
6 def startswith(sub,data):
7 _sub='\A%s' % sub
8 result=re.findall(_sub,data)
9 for i in result:
10 return True
11 return False
12
13 #判断字符串以什么结尾
14 def endswith(sub,data):
15 _sub='%s\Z' % sub
16 result=re.findall(_sub,data)
17 if len(result) != 0:
18 return True
19 else:
20 return False
21
22 #判断字符串真实的长度
23 def real_len(data):
24 result=re.findall('\S',data)
25 print(result) #['m', 'y', 'n', 'a', 'm', 'e', 'i', 's', 'z', 'h', 'a', 'n', 'g', 's', 'a', 'n', ',', 'm', 'y', 'a', 'g', 'e', '3', '3', ',', 't', 'o', 'p', '1', '7', '5']
26 return len(result)
27
28 if __name__=='__main__':
29 data='my name is zhangsan,my age 33,top 175'
30 #startswith
31 result=startswith('my',data)
32 result1=startswith('myw',data)
33 print(result) #True
34 print(result1) #False
35 #endswith
36 result2=endswith('75',data)
37 result3=endswith('000',data)
38 print(result2) #True
39 print(result3) #False
40 #real_len
41 result4=real_len(data)
42 print(len(data)) #37
43 print(result4) #31
3.正则表达式的量词
4.正则的综合练习
1 # coding:utf-8
2 import re
3
4 #网址匹配
5 def check_url(url):
6 result=re.findall('[a-zA-Z]{4,5}://\w*\.*\w+\.\w+',url)
7 if len(result) !=0 :
8 return True
9 else:
10 return False
11 #获取网址,通过组()获取我们过滤出来的信息
12 def get_url(url):
13 result = re.findall('http[a-zA-Z]*://(\w*\.*\w+\.\w+)', url)
14 if len(result) !=0:
15 return result[0]
16 else:
17 return ''
18
19 #检验邮箱是否正确
20 def get_email(data):
21 result=re.findall('.+@.+\.[a-zA-Z]+',data)
22 return result
23
24 #获取网页style属性信息
25 def get_html_data(data):
26 result=re.findall('style="(.*?)"',data) #?的作用:例子中筛选规则结尾的双引号找到一次就结束,而不是贪婪的找到最后一个双引号
27 return result
28
29 #获取网页所有属性的值
30 def get_all_data_html(data):
31 result=re.findall('="(.+?)"',data)
32 return result
33
34 if __name__=='__main__':
35 url = 'http://www.baidu.com'
36 emails='zhangsan@qq.com'
37 html = ('<div class="s-top-nav" style="display:none;">'
38 '</div><div class="s-center-box"></div>')
39 print(check_url(url)) #True
40 print(get_url(url)) #www.baidu.com
41 print(get_email(emails)) #['zhangsan@qq.com']
42 print(get_html_data(html)) #['display:none;']
43 print(get_all_data_html(html)) #['s-top-nav', 'display:none;', 's-center-box']
5.正则表达式的re模块
5.1.findall()的使用
5.2.search()的使用
5.3.group()与groups()的使用
跟search()配合使用,search返回匹配对象;group/groups读取组的序列是从1开始
5.4.split()正则替换
根据正则规则对字符串进行切割
\W字符数字以外的字符,相当于根据图示字符串中的空格作为匹配规则,进行切割
5.5.compile的使用
5.6.match的使用
match只会匹配字符串从头开始的信息,match返回的匹配对象也可以通过group进行调用
5.7.re的额外匹配要求
1 # coding:utf-8
2
3 import re
4
5 def check_url(url):
6 re_g = re.compile('[a-zA-Z]{4,5}://\w*\.*\w+\.\w+')
7 print(re_g) #re.compile('[a-zA-Z]{4,5}://\\w*\\.*\\w+\\.\\w+')
8 result = re_g.findall(url)
9 if len(result) != 0:
10 return True
11 else:
12 return False
13
14 def get_url(url):
15 re_g = re.compile('[https://|http://](\w*\.*\w+\.\w+)')
16 result = re_g.findall(url)
17 if len(result) != 0:
18 return result[0]
19 else:
20 return ''
21
22
23 def get_email(data):
24 re_g = re.compile('.+@.+\.[a-zA-Z]+')
25 result = re_g.findall(data)
26 return result
27
28
29 html = ('<div class="s-top-nav" style="display:none;">'
30 '</div><div class="s-center-box"></div>')
31
32
33 def get_html_data(data):
34 re_g = re.compile('style="(.*?)"')
35 result = re_g.findall(data)
36 return result
37
38 def get_all_data_html(data):
39 re_g = re.compile('="(.+?)"')
40 result = re_g.findall(data)
41 return result
42
43
44 if __name__ == '__main__':
45 result = check_url('http://www.baidu.com/')
46 print(result) #True
47 result = get_url('https://www.baidu.com/')
48 print(result, 'get_url') #www.baidu.com get_url
49 result = get_email('dewei@123.net')
50 print(result) #['dewei@123.net']
51 result = get_html_data(html)
52 print(result) #['display:none;']
53 result = get_all_data_html(html)
54 print(result) #['s-top-nav', 'display:none;', 's-center-box']
55 re_g = re.compile(('<div class="(.*?)" style="(.*?)">'
56 '</div><div class="(.*?)"></div>'))
57 result = re_g.search(html)
58 print(result.groups()) #('s-top-nav', 'display:none;', 's-center-box')
59 print(result.group(1)) #s-top-nav
60 print(result.group(2)) #display:none;
61 print(result.group(3)) #s-center-box
62 # print(result.group(4))
63 re_g = re.compile('\s')
64 result = re_g.split(html)
65 print(result) #['<div', 'class="s-top-nav"', 'style="display:none;"></div><div', 'class="s-center-box"></div>']
66
67 re_g = re.compile('<div class="(.*?)"')
68 result = re_g.match(html)
69 print(result.span()) #正则对象.span()返回对象的序列范围,(0, 22)
70 print(html[: 22]) #<div class="s-top-nav"
6.Python常见匹配案例
6.1.匹配1-100之间的数
1 import re
2
3 s = '100' # 1-100内的任意数字
4 ret = re.match(r'(100|[1-9]\d{0,1})$', s)
5 print(ret.group())
6 # 运行结果:
7 # 100
6.2.匹配座机号码
1 import re
2
3 s = "010-12345678"
4 ret = re.search(r'^\d{3,4}-\d{7,8}$', s)
5 print(ret.group())
6 # 运行结果:
7 # 010-12345678
6.3.匹配5-10位纯数字组成的qq号码,且不能以0开头
1 import re
2
3 s = "11010"
4 ret = re.match(r'[1-9]\d{4,9}$', s)
5 if ret != None:
6 print(ret.group())
7 else:
8 print('匹配失败!')
9 # 运行结果:
10 # 11010
6.4.取出字符串中的所有字母
1 import re
2
3 s = "43arwer32656fafa6546jjuy#H"
4 res = re.compile(r'[a-zA-Z]+')
5 ret = res.findall(s)
6 print(ret)
7 # 运行结果:
8 # ['arwer', 'fafa', 'jjuy', 'H']
6.5.找出以字母y结尾的单词,忽略大小写
1 import re
2
3 s = 'study hard and make progress every day'
4 res = re.compile(r'\w+y\b', re.I) # \b为边界
5 ret = res.findall(s)
6 print(ret)
7 # 运行结果:
8 # ['study', 'every', 'day']
6.6.将多个重复的字母替换成&
1 import re
2
3 s = "PythondddJavauuuHTMLFFPHP"
4 res = re.compile(r'([a-zA-Z])\1+')
5 ret = res.sub('&', s)
6 print(ret)
7 # 运行结果:
8 # Python&Java&HTML&PHP
6.7.将字符串变成 '我要学Python编程
1 import re
2
3 s = "我我...我我...我要..要要...要要...学学学...学学..Python...编编编..编程..程.程...程...程"
4 res = re.sub(r'\W+', '', s)
5 ret = re.sub(r'(.)\1+', r'\1', res)
6 print(ret)
7 # 运行结果:
8 # 我要学Python编程
Python语法进阶(2)- 正则表达式的更多相关文章
- Python语法进阶
1.变量进阶 2.局部变量.全局变量 3.函数进阶 4.函数进阶
- Python语法进阶(1)- 进程与线程编程
1.进程与多进程 1.1.什么是进程 进程就是程序执行的载体 什么叫多任务? 多任务就是操作系统可以同时运行多个任务.比如你一边在用浏览器学习,还一边在听音乐,,这就是多任务,至少同时有3个任务正在运 ...
- python进阶11 正则表达式
python进阶11 正则表达式 一.概念 #正则表达式主要解决什么问题? #1.判断一个字符串是否匹配给定的格式,判断用户提交的又想的格式是否正确 #2.从一个字符串中按指定格式提取信息,抓取页面中 ...
- python进阶(20) 正则表达式的超详细使用
正则表达式 正则表达式(Regular Expression,在代码中常简写为regex. regexp.RE 或re)是预先定义好的一个"规则字符率",通过这个"规 ...
- [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门
[.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门 1. 什么是正则表达式? 1.1 正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简 ...
- [.net 面向对象程序设计进阶] (3) 正则表达式 (二) 高级应用
[.net 面向对象程序设计进阶] (2) 正则表达式 (二) 高级应用 上一节我们说到了C#使用正则表达式的几种方法(Replace,Match,Matches,IsMatch,Split等),还 ...
- Python标准库01 正则表达式(re包)
python正则表达式基础 简单介绍 正则表达式并不是python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大 ...
- python 优雅的使用正则表达式 ~ 2
使用正则表达式 那些基础的理论也说了不少了现在就开始 实操 ( 不知道为啥特别喜欢这个词... ) 吧 . 上一节课说过 正则表达式也是一门语言 , 他被集成到了python当中 , 并且用 re 模 ...
- Python之re模块 —— 正则表达式操作
这个模块提供了与 Perl 相似l的正则表达式匹配操作.Unicode字符串也同样适用. 正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突, ...
随机推荐
- KMP算法解题模板(更新)
/* kmp算法的主要作用在于对next数组的运用,所以这里只给出next数组的模板 性质1:对于每一个长度len的子串,该子串的最小循环节为len-next[len] 性质2:kmp的next不断向 ...
- 机器学习&恶意代码静态检测
目录 分析工具 方法概述 二进制灰度图 字节(熵)直方图 字符串信息 ELF结构信息 源码分析与OPcode FCG references: 分析工具 readelf elfparser ninja ...
- 白嫖党的福音!!!全新的Java300集视频(2022版)来了!
它来了它来了,经过一年时间的沉淀, [尚学堂]高淇Java300集完整版正式发布啦! 应广大网友和尚学堂忠实的孜孜学子以及听众朋友的要求,尚学堂在去年十月份就把预计在2022年发布的Java300集提 ...
- 【体验】在Adobe After Effects CC 2018中使用脚本创建窗口
1.主界面 2.脚本编辑器主界面 3.对象浏览器 在脚本编辑器中按F1 4.写一段 ScriptUI var win = new Window('window', 'my win', [100, 10 ...
- 关于启动bash提示‘bash: export: `//这是新的': not a valid identifier’的解决办法
学习linux以来将centos改的也不少了,也不知道这个问题是由于那个修改来的.最近改bash的操作环境配置文件,用到了~/.bashrc这个文件,发现里面被我修改过. 那是当年安装fcitx输入法 ...
- 什么是VPC
1 什么是私有网络(VPC) 私有网络是一块可用户自定义的网络空间,您可以在私有网络内部署云主机.负载均衡.数据库.Nosql快存储等云服务资源.您可自由划分网段.制定路由策略.私有网络可以配置公网网 ...
- MySql下载与安装(部署)
一:MySQL介绍 1.MySQL简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB ...
- shell循环ping ip的写法
#!/bin/bash for i in `seq 1 20` do if ping -w 2 -c 1 192.168.43.$i | grep "100%" > /dev ...
- SQL解析器详解
1.概述 最近,有同学留言关于SQL解析器方面的问题,今天笔者就为大家分享一下SQL解析器方便的一些内容. 2.内容 2.1 SQL解析器是什么? SQL解析与优化是属于编辑器方面的知识,与C语言这类 ...
- jstl split 分割字符串?
1. 在已经获得数据的前提下,对数据进行分割,分割后的结果是一个数组,可以通过数组获得我们需要的数据 2. value 是获得值 需要${} 的方式获取, var 是设置变量. var = " ...