57°

正则表达式

一.
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

    我有话说: