Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

正则表达式

Talos仇嘉豪 2019-08-13 22:25:00 阅读数:13 评论数:0 点赞数:0 收藏数:0

一.
re模块的使⽤过程
 

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

  

二.

 

三.


示例1*

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

 四.

 

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

 

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

 

 五.

示例1:|
需求:匹配出0-100之间的数字
 #coding=utf-8
 import re 
 ret = re.match("[1-9]?\d","") 
 print(ret.group()) #
 ret = re.match("[1-9]?\d","") 
 print(ret.group()) #
 # 不正确的情况
 ret = re.match("[1-9]?\d","") 
 print(ret.group()) #
 # 修正之后的
 ret = re.match("[1-9]?\d$","") 
 if ret: 
     print(ret.group()) 
 else: 
     print("不在0-100之间") 
 # 添加|
 ret = re.match("[1-9]?\d$|100","") 
 print(ret.group()) # ret = re.match("[1-9]?\d$|100","78")
 print(ret.group()) #
 ret = re.match("[1-9]?\d$|100","") 
 # print(ret.group()) # 不是0-100之间
 ret = re.match("[1-9]?\d$|100","") 
 print(ret.group()) #

示例2:

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

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

 

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

 

 
六.re模块的⾼级⽤法
div>
search 需求:匹配出⽂章阅读的次数
search会从左往右依次寻找,直到不满足
 #coding=utf-8
 import re 
 ret = re.search(r"\d+", "阅读次数为 9999") 
 ret.group() 
 
 运⾏结果: 
 ''
findall
需求:统计出python、c、c++相应⽂章阅读的次数
findall 全部查找,返回列表
 #coding=utf-8
 import re 
 ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345") 
 print(ret) 
 
 运⾏结果: 
 ['', '', ''
sub 将匹配到的数据进⾏替换 需求:将匹配到的阅读次数加1
相当于替换,注意格式
 ⽅法1: 
 #coding=utf-8
 import re 
 ret = re.sub(r"\d+", '', "python = 997") 
 print(ret) 
 
 运⾏结果: 
 python = 998
 
 ⽅法2: 
 #coding=utf-8
 import re 
 def add(temp): 
 strNum = temp.group() 
 num = int(strNum) + 1
 return str(num) 
 ret = re.sub(r"\d+", add, "python = 997") 
 print(ret) 
 ret = re.sub(r"\d+", add, "python = 99") 
 print(ret) 
 
 运⾏结果: 
 python = 998
 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', '', 'shandong']
python贪婪和⾮贪婪
Python⾥数量词默认是贪婪的(在少数语⾔⾥也可能是默认⾮贪婪),总是 尝试匹配尽可能多的字符;
⾮贪婪则相反,总是尝试匹配尽可能少的字符。 在"*","?","+","{m,n}"后⾯加上?,使贪婪变成⾮贪婪
注意:是在数量词后面加?变成非贪婪
?两种作用
^两种作用
.不能匹配\n 如需匹配要加re.DOTALL
Python中字符串前⾯加上 r 表示原⽣字符串

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明
本文为[Talos仇嘉豪]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/talosant/p/11343627.html