ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

正则表达式

2022-04-12 09:33:17  阅读:196  来源: 互联网

标签:匹配 正则表达式 导出 re 正则 print math


正则表达式
一.什么是正则表达式?
简单来说就是按照一定的规则去处理字符串的一个工具,这个规则叫正则表达式
正则表达式独立任何编程语言之外
二.正则表达式的使用方法:
1 导入re库
2 定义正则规则以及需要匹配的字符串
3 进行校验得到结果
例:
import re
str = "wo shi di yi ming"
pattern = "yi"
result = re.match(pattern,str)
print(result.group())
其中
re.match(正则规则,字符串)
即从左往右进行匹配,如果符合规则,返回对象,如果没有匹配上返回None
group() 将匹配到的内容提取出来(从左往右获取第一次匹配到的内容)
三.正则表示字符
字符 功能
. 匹配任意1个字符(除了\n)
[ ] 匹配[ ]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即 空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符
光看这些太过于抽象,下面让我们用例子来看一下
import re
print(re.math(".","\nqwer"))[这个即导出None]
print(re.math("....","qwer"))[这个即导出qwer]
print(re.math("\d","qw999"))[这个即导出qwer]
print(re.math("\d\d\d\d","9999"))[这个即导出9999]
print(re.math("\D","qwer"))[这个即导出qwer]
print(re.math("\D","33333"))[这个即导出None]
print(re.math("\s","\t9qwewr"))[这个即导出None]
print(re.math("\s","qwer"))[这个即导出q]
print(re.math("\S","\tqwer"))[这个即导出\t]
print(re.math("\w","_qwer"))[这个即导出_]
print(re.math("\W",":"))[这个即导出:]
我们在登录页面时,经常登录手机号,手机号规则就是用正则来做的
例如:
print(re.math("1[3-9]\d\d\d\d\d\d\d\d\d","13848665658"))[这个即导出13848665658]
四.正则表示数量
字符 功能
* 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 {0,1}
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次
正则数量是搭配表示字符使用的,主要就是为避免手机号匹配时代码太过繁琐而设计
下面我们来写代码看使用方法
import re
print(re.math("\d*","qwer"))[这个即导出""]
print(re.math("\d*","123456"))[这个即导出123456]
print(re.math("\d+","qwer"))[这个即导出None]
print(re.math("\d?","123546"))[这个即导出1]
print(re.math("\d?[a-z]","123qwer"))[这个即导出None]
print(re.math("\d+[a-z]","123qwer"))[这个即导出123q]
print(re.math("\d{3}[a-z]","123qwer"))[这个即导出123q]
print(re.math("\d{3,}[a-z]","123456qwer"))[这个即导出123546q]
五.正则表示边界
字符 功能
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配一个单词的边界
\B 匹配非单词边界
这是正则表示边界的方法,可以在我们爬取网络链接后,提取出我们需要的东西
使用方法为
import re
print(re.match(r"1[3-9]\d{9}$","13181823848"))
print(re.match(r"^1[3-9]\d{9}$","13181823848")
(上面两个即为以1开头,9个数字结尾的字符串)
print(re.match(r"^\w+pp\b","happy"))[None]
print(re.match(r"^\w+\s\by\b","happ y"))[y]
print(re.match(r"^\w+\s\b_p\b","hap _p y"))
六.正则的匹配分组
字符 功能
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
\num 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串
分组可以更方便的处理字符串
print(re.match(r"[1-9]\d?|0$|100$","100"))[可以输出100]
str1 = "<title>腾讯首页</title>"
result = re.match(r"<title>(.*)</title>",str1)
print(result.group(1))
(输出了链接中的中文)
str1 = "<title>腾讯首页</title>"
result = re.match(r"<(.*)>(.*)</.*>",str1)
print(result.groups())
(取出所有中英文,并分别放在一个元组中)
str2 = "<html><title>腾讯首页</title></html>"
result = re.match(r"<(?P<h>.+)><(?P<t>.+)>(.*)</(?P=t)></(?P=h)>",str2)
print(result.groups())
(前后一样的时候,可以给其命名,让代码更加直观,避免繁琐)
七.正则的高级用法
search(正则,字符串) 方法:从字符串中查找一个字符串,如果符合要求返回第一个,如果没有返回None
findall(正则,字符串) 找到所有符合条件的内容,存储到列表中
sub(正则,替换内容,字符串) 在字符串中按照正则替换匹配到的内容,替换的内容可以传入一个函数
split(正则,字符串) 将字符串按照正则规则进行切割,将切割后的内容存储在列表中
八.贪婪模式和非贪婪模式
举一个很简单的例子
import re
str = "please call me. my number 138-4532-5698"
result = re.match(r".+(\d+-\d+-\d+)","str")
print(result.group(1))
此时输出的是8-4532-5698
这就是贪婪模式,即满足后面规则的最低要求即可,前面的规则尽可能多的匹配
消除这种模式只需要在括号前加一个?即可
也就是result = re.match(r".+?(\d+-\d+-\d+)","str")
这就是非贪婪模式


正则表达式,我的理解是,他就是一种处理字符串的方式,可以让我们在字符串中更好的提取出我们需要的东西
附加三个综合应用,大家可以自己去尝试一下
1使用sub提取招聘数据(去除所有标签)
"""
job_text = """
<div>
岗位职责:
<p><br>1. 负责音乐教育产品服务端应用开发 </p>
<br>2. 负责开发服务端的音乐数据处理工具(音频、视频、MIDI、曲谱等)
<br>3. 负责大数据相关的采集、预处理、后处理的开发
<br>岗位要求:
<br>1. 熟悉基于Python的服务端应用开发,掌握至少一种Python服务端框架(Flask/Django/FastAPI等)
<br>2. 有良好的的编码习惯,命名规范、逻辑清晰、代码冗余率低
<br>3. 有音视频等媒体相关编程经验者优先
<br>4. 有tensorflow或基础机器学习开发经验的优先</div>
"""

"""
2提取网址
原网址:
https://v.huya.com/cat/51
https://699pic.com/tupian-501366475.html

替换后为:
https://v.huya.com/
https://699pic.com/

"""

"""
3提取出文本中所有的英文单词以及数字
熟悉基于Python的服务端应用开发,掌握至少一种Python服务端框架(Flask/Django/FastAPI等),薪水100000
"""

 

标签:匹配,正则表达式,导出,re,正则,print,math
来源: https://www.cnblogs.com/linche-2022/p/16133603.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有