正则表达式

Posted mryang123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式

一、正则介绍

二、匹配一个字符

三、量词

四、分组和位置

五、函数

六、贪婪,懒惰和字符r的作用

回到顶部

 

一、正则介绍

1.作用

  正则(Regular Expression) : 表达对数据的匹配  过滤  提取逻辑的表达式

  匹配结果对象 = re.match(正则, 数据)

?     从头开始匹配 如果某一个匹配失败 整体就失败了

?     如果匹配成功 返回匹配结果对象

?     如果匹配失败 返回None

  获取匹配结果

?     匹配结果对象.group()

  "强烈"建议: 正则一律加上r字符 r字符可以对正则表达式中的    进行转义

二、匹配一个字符

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" 匹配|左右任意一个表达式

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>&nbsp;<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>&nbsp;<br></p>
<p>加分项:</p>
<p>大数据,数理统计,机器学习,sklearn,高性能,大并发。</p>

</div>"""

res = re.sub(r"</?w+>|s|&nbsp", "", 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)
add函数增加案例

  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" 自动对数据中的进行转义 ——> 双反斜杠

 

以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

攻破难啃的骨头-正则表达式(转)

正则表达式的贪婪和非贪婪模式