首页 > 其他 > 详细

正则表达式

时间:2019-08-13 22:39:45      阅读:121      评论:0      收藏:0      [点我收藏+]
一.
re模块的使?过程

#coding=utf-8
# 导?re模块
import re
# 使?match?法进?匹配操作
result = re.match(正则表达式,要匹配的字符串)
# 如果上?步匹配到数据的话,可以使?group?法来提取数据
result.group()

二.

 技术分享图片

三.

技术分享图片


示例1*

需求:匹配出,?个字符串第?个字?为??字符,后?都是?写字?并且 这些?写字? 可有可无
 
 1 #coding=utf-8
 2 import re
 3 ret = re.match("[A-Z][a-z]*","M")
 4 print(ret.group())
 5 ret = re.match("[A-Z][a-z]*","MnnM")
 6 print(ret.group())
 7 ret = re.match("[A-Z][a-z]*","Aabcdef")
 8 print(ret.group())
9 运?结果: 10 M 11 python?级 12 匹配多个字符 14 13 Mnn 14 Aabcdef
示例2:+
需求:匹配出,变量名是否有效
 1 #coding=utf-8
 2 import re
 3 names = ["name1", "_name", "2_name", "__name__"]
 4 for name in names:
 5   ret = re.match("[a-zA-Z_]+[\w]*",name)
 6 if ret:
 7   print("变量名 %s 符合要求" % ret.group())
 8 else:
 9   print("变量名 %s ?法" % name)
10 
11 运?结果:
12 变量名 name1 符合要求
13 变量名 _name 符合要求
14 变量名 2_name ?法
15 变量名 __name__ 符合要求
示例3:?
需求:匹配出,0到99之间的数字
 1 #coding=utf-8
 2 import re
 3 ret = re.match("[1-9]?[0-9]","7")
 4 python?级
 5 匹配多个字符 15
 6 print(ret.group())
 7 ret = re.match("[1-9]?\d","33")
 8 print(ret.group())
 9 ret = re.match("[1-9]?\d","09")
10 print(ret.group())
11 
12 运?结果:
13 7
14 33
15 0 # 这个结果并不是想要的,利?$才能解决
示例4:
{m} 需求:匹配出,8到20位的密码,可以是??写英?字?、数字、下划线
 1 #coding=utf-8
 2 import re
 3 ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678")
 4 print(ret.group())
 5 ret = re.match("[a-zA-Z0-9_]{8,20}","1ad12f23s34455ff66")
 6 print(ret.group())
 7 
 8 运?结果:
 9 12a3g4
10 1ad12f23s34455ff66

 四.

 技术分享图片

示例1:匹配出163的邮箱地址,且@符号之前有4到 20位,例如hello@163.com

 

 1  #coding=utf-8
 2 import re
 3 email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei",]
 4 for email in email_list:
 5     ret = re.match("[\w]{4,20}@163\.com$", email)
 6   if ret:
 7     print("%s 是符合规定的邮件地址,匹配后的结果是:%s" % (email, ret.group()))
 8   else:
 9      print("%s 不符合要求" % email)
10 
11 
12 运?结果:
13  xiaoWang@163.com 是符合规定的邮件地址,匹配后的结果是:xiaoWang@163.com
14  xiaoWang@163.comheihei 是符合规定的邮件地址,匹配后的结果是:xiaoWang@163.co.com.xiaowang@qq.com 不符合要求

 

 五.

技术分享图片

示例1:|
需求:匹配出0-100之间的数字
 1 #coding=utf-8
 2 import re
 3 ret = re.match("[1-9]?\d","8")
 4 print(ret.group()) # 8
 5 ret = re.match("[1-9]?\d","78")
 6 print(ret.group()) # 78
 7 # 不正确的情况
 8 ret = re.match("[1-9]?\d","08")
 9 print(ret.group()) # 0
10 # 修正之后的
11 ret = re.match("[1-9]?\d$","08")
12 if ret:
13     print(ret.group())
14 else:
15     print("不在0-100之间")
16 # 添加|
17 ret = re.match("[1-9]?\d$|100","8")
18 print(ret.group()) # ret = re.match("[1-9]?\d$|100","78")
19 print(ret.group()) # 78
20 ret = re.match("[1-9]?\d$|100","08")
21 # print(ret.group()) # 不是0-100之间
22 ret = re.match("[1-9]?\d$|100","100")
23 print(ret.group()) # 100

示例2:

不是以4、7结尾的?机号码(11位)

1 import re
2 tels = ["13100001234", "18912344321", "10086", "18800007777"]
3 for tel in tels:
4   ret = re.match("1\d{9}[0-35-68-9]", tel)
5 if ret:
6   print(ret.group())
7 else:
8   print("%s 不是想要的?机号" % tel)
提取区号和电话号码
1 >>> ret = re.match("([^-]*)-(\d+)","010-12345678")  #[^-]的意思是非-
2 >>> ret.group()
3 010-12345678
4 >>> ret.group(1)
5 010
6 >>> ret.group(2)
7 12345678
示例3:\
需求:匹配出 <html>hh</html>
 1 #coding=utf-8
 2 import re
 3 # 能够完成对正确的字符串的匹配
 4 ret = re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>", "<html>hh</html>")
 5 print(ret.group())
 6 # 如果遇到?正常的html格式字符串,匹配出错
 7 ret = re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>", "<html>hh</htmlbalabala>")
 8 print(ret.group())
 9 # 正确的理解思路:如果在第?对<>中是什么,按理说在后?的那对<>中就应该是什么
10 # 通过引?分组中匹配到的数据即可,但是要注意是元字符串,即类似 r""这种格式
11 ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>")
12 print(ret.group())
13 # 因为2对<>中的数据不?致,所以没有匹配出来
14 test_label = "<html>hh</htmlbalabala>"
15 ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", test_label)
16 if ret:
17     print(ret.group())
18 else:
19     print("%s 这是?对不正确的标签" % test_label)
20 
21 运?结果:
22 <html>hh</html>
23 <html>hh</htmlbalabala>
24 <html>hh</html>
25 <html>hh</htmlbalabala> 这是?对不正确的标签
示例4:\number
需求:匹配出<html><h1>www.itcast.cn</h1></html>
 1 #coding=utf-8
 2 import re
 3 labels = ["<html><h1>www.itcast.cn</h1></html>",<html><h1>www.itcast.cn</h2></html>"]
 4 for label in labels:
 5     ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
 6     if ret:
 7         print("%s 是符合要求的标签" % ret.group())
 8     else:
 9         print("%s 不符合要求" % label)
10 
11 运?结果:
12 <html><h1>www.itcast.cn</h1></html> 是符合要求的标签
13 <html><h1>www.itcast.cn</h2></html> 不符合要求

 

示例5.(?P<name>)  (?P=name)
需求:匹配出<html><h1>www.itcast.cn</h1></html>
1 #coding=utf-8
2 import re
3 ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>","<html><h1>www.itcast.cn</h1></html>")
4 ret.group()
5 ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>","<html><h1>www.itcast.cn</h1></html>")
6 ret.group()

 

 
六.re模块的?级?法
div>
search 需求:匹配出?章阅读的次数
search会从左往右依次寻找,直到不满足
1 #coding=utf-8
2 import re
3 ret = re.search(r"\d+", "阅读次数为 9999")  
4 ret.group()
5 
6 运?结果:
7 9999
findall
需求:统计出python、c、c++相应?章阅读的次数
findall 全部查找,返回列表
1 #coding=utf-8
2 import re
3 ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")
4 print(ret)
5 
6 运?结果:
7 [9999, 7890, 12345
sub 将匹配到的数据进?替换 需求:将匹配到的阅读次数加1
相当于替换,注意格式
 1 ?法1:
 2 #coding=utf-8
 3 import re
 4 ret = re.sub(r"\d+", 998, "python = 997")
 5 print(ret)
 6 
 7 运?结果:
 8 python = 998
 9 
10 ?法2:
11 #coding=utf-8
12 import re
13 def add(temp):
14 strNum = temp.group()
15 num = int(strNum) + 1
16 return str(num)
17 ret = re.sub(r"\d+", add, "python = 997")
18 print(ret)
19 ret = re.sub(r"\d+", add, "python = 99")
20 print(ret)
21 
22 运?结果:
23 python = 998
24 python = 100

 

练习

 

练习1.从下?的字符串中取出?本
<div>
<p>岗位职责:</p>
<p>完成推荐算法、数据统计、接?、后台等服务器端相关?作</p>
<p><br></p>
<p>必备要求:</p>
<p>良好的?我驱动?和职业素养,?作积极主动、结果导向</p>
<p>&nbsp;<br></p>
<p>技术要求:</p>
<p>1、?年以上 Python 开发经验,掌握?向对象分析和设计,了解设计模式</p>
<p>2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p>
<p>3、掌握关系数据库开发设计,掌握 SQL,熟练使? MySQL/PostgreSQL 中的?种
<p>4、掌握NoSQL、MQ,熟练使?对应技术解决?案</p>
<p>5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js</p>
<p>&nbsp;<br></p>
<p>加分项:</p>
<p>?数据,数理统计,机器学习,sklearn,?性能,?并发。</p>
</div>

参考答案:
re.sub(r"<[^>]*>|&nbsp;|\n", "", test_str)

练习2.split 根据匹配进?切割字符串,并返回?个列表
需求:切割字符串“info:xiaoZhang 33 shandong”
#coding=utf-8
import re
ret = re.split(r":| ","info:xiaoZhang 33 shandong")
print(ret)
运?结果: [
info, xiaoZhang, 33, shandong]
python贪婪和?贪婪
Python?数量词默认是贪婪的(在少数语??也可能是默认?贪婪),总是 尝试匹配尽可能多的字符;
?贪婪则相反,总是尝试匹配尽可能少的字符。 在"*","?","+","{m,n}"后?加上?,使贪婪变成?贪婪
注意:是在数量词后面加?变成非贪婪
?两种作用
^两种作用
.不能匹配\n 如需匹配要加re.DOTALL
Python中字符串前?加上 r 表示原?字符串

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

正则表达式

原文:https://www.cnblogs.com/talosant/p/11343627.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!