正则表达式
Posted mryang123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式
一、正则介绍
1.作用
正则(Regular Expression) : 表达对数据的匹配 过滤 提取逻辑的表达式
? 从头开始匹配 如果某一个匹配失败 整体就失败了
? 如果匹配成功 返回匹配结果对象
? 如果匹配失败 返回None
获取匹配结果
? 匹配结果对象.group()
"强烈"建议:
二、匹配一个字符
1. . 字符
点字符 : 代表匹配任意一个字符 默认除了
re.S模式可以让 . 匹配 : re.match(r"d{3,5}.+", "123 qq", "re.S")
. 与字符 点 相同 多用于在匹配邮箱时候使用
2. [] 匹配字符
[] : 匹配其中任意一个字符
[0-9] : 是指 0 - 9 的范围
[^0-9] : 取反 禁止匹配
3. d w s字符
d : 数字字符
w : 单词字符[0-9a-zA-Z_]
在py3 中 Unicdode w 可以匹配汉字
在py2 中 Ascll w不能匹配汉字
s : 空白字符
三、量词
1.{}字符 : 匹配{m,n}, 至少m次 之多n次, {m}m次
2.*字符 : 任意次
3.+字符 : 至少一次
4.?字符 : 0次或者1次
四、分组和位置
1.分组
目的 : 提取出想要的部分
2.匿名分组
创建: "(正则)"
? 用户创建的分组从1开始 0号分组已经存储整体结果
获取分组结果:
? 匹配结果对象.group(分组编号=0)
? .group(编号,编号)
分组引用:
? 希望在正则的后续位置使用前面的分组匹配的数据
? 分组的编号
re.match(r"嫦娥(d+)号", "嫦娥998号").group() re.match(r"嫦娥(d+)号", "嫦娥998号").group(0) re.match(r"嫦娥(d+)号", "嫦娥998号").group(1) re.match(r"嫦娥(d+)号 998", "嫦娥998号 998").group(1) re.match(r"嫦娥(d+)号 999", "嫦娥999号 999").group(1) # 上面写 不灵活 每次分组数据不一样全部需要改写 # 如果需要使用前面分组的数据继续匹配 - 分组引用 re.match(r"嫦娥(d+)号 1", "嫦娥999号 999").group(1) re.match(r"嫦娥(d+)号 1", "嫦娥1999号 1999").group(1) re.match(r"(d{3,4})-d{6,8}", "010-000001").group() re.match(r"(d{3,4})-d{6,8}", "010-000001").group(1) re.match(r"(d{3,4})-(d{6,8})", "010-000001").group(2) re.match(r"(d{3,4})-(d{6,8}) 1-2", "010-000001 010-000001").group(2)
3.命名分组
? 给每个分组起一个名称 编号发送变化不会影响正则的使用
创建
? "(?P<分组名称>正则)"
获取结果
? .group(分组名称)
? * 也可以通过下标访问
创建分组并分组引用
? "(?P<分组名称>正则) (?P=分组名称)"
re.match(r"(?P<area>d{3,4})-(?P<no>d{6,8}) (?P=area)-(?P=no)", "010-000001 010-000001").group(1,2) re.match(r"(?P<area>d{3,4})-(?P<no>d{6,8}) (?P=area)-(?P=no)", "010-000001 010-000001").group(‘no‘) re.match(r"((?P<area>d{3,4})-(?P<no>d{6,8})) (?P=area)-(?P=no)", "010-000001 010-000001").group(‘no‘)
4. | 符号
r"表达式(部分1|部分2|部分3)" 匹配分组中 |左右任意一个表达式
re.match(r"^w{4,16}@163.com$", "[email protected]").group() re.match(r"^w{4,16}@163.com$|^w{4,16}@263.com$|^w{4,16}@qq.com$", "[email protected]").group() re.match(r"^w{4,16}@(163|263|qq).com$", "[email protected]").group()
五、函数
match(正则,数据) - -> 匹配对象 从头匹配
search(正则,数据) - -> 匹配对象 从头开始搜索 往后面尝试
findall(正则,数据) --> 返回列表 查找所有
sub(正则,替换数据,数据,次数) -- > 替换后的数据
html =""" <div> <p>岗位职责:</p> <p>完成推荐算法、数据统计、接口、后台等服务器端相关工作</p> <p><br></p> <p>必备要求:</p> <p>良好的自我驱动力和职业素养,工作积极主动、结果导向</p> <p> <br></p> <p>技术要求:</p> <p>1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式</p> <p>2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p> <p>3、掌握关系数据库开发设计,掌握 SQL,熟练使用 mysql/PostgreSQL 中的一种<br></p> <p>4、掌握NoSQL、MQ,熟练使用对应技术解决方案</p> <p>5、熟悉 javascript/CSS/HTML5,JQuery、React、Vue.js</p> <p> <br></p> <p>加分项:</p> <p>大数据,数理统计,机器学习,sklearn,高性能,大并发。</p> </div>""" res = re.sub(r"</?w+>|s| ", "", html) print(res)
def add(match_obj): # 获取匹配结果的数据 value = match_obj.group() result = int(value) + 1 # 返回值必须是字符串类型 return str(result) res = re.sub(r"d{2,3}", add, "python=100 cp=96") print(res)
split(正则,数据) --> 切割后的列表
data = "貂蝉,杨玉环:西施,王昭君 凤姐" res = re.split(r",|:|s", data) print(res)
六、贪婪,懒惰和字符r的作用
1.贪婪和懒惰
?懒惰 尽可能少匹配
贪婪模式变为懒惰模式 量词后加?即可
# html 去直播找源代码 res = re.search(r"https://.+.jpg", html).group() # 一个结果很长 print(res) # res = re.search(r"https://.+?.jpg", html).group() # 一个结果很短 # # 理解贪婪模式和非贪婪模式之后 再看下面的代码 # print(res) # res = re.findall(r"https://.+?.jpg|https://.+?.png", html) # print(res) # res = re.findall(r"https://.+?.(?:jpg|png)", html) # print(res) # 取消分组 因为findall的结果默认是用户创建的分组数据 需要取消用户创建的分组从而显示整体结果(?:正则)
# 验证贪婪和懒惰 # res = re.match(r"^(d+?)(d+)$", "13546456789").group(1,2) # res = re.match(r"^(d+?)(d?)$", "13546456789").group(1,2) # res = re.match(r"^(d+)(d?)$", "13546456789").group(1,2) # print(res)
2. r
如果字符串中有双斜杠 正则需要四反斜杠来进行匹配
? 为解决反斜杠困扰问题, 使用r标识数据
? r"1" ===> "\1" 自动对数据中的进行转义 ——> 双反斜杠
以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性