正则表达式

正则表达式html

1、正则介绍python

2、匹配一个字符正则表达式

3、量词算法

4、分组和位置数据库

5、函数设计模式

6、贪婪,懒惰和字符r的做用服务器

回到顶部并发

 

1、正则介绍

1.做用框架

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

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

​     从头开始匹配 若是某一个匹配失败 总体就失败了

​     若是匹配成功 返回匹配结果对象

​     若是匹配失败 返回None

  获取匹配结果

​     匹配结果对象.group()

  "强烈"建议: 正则一概加上r字符 r字符能够对正则表达式中的  \  进行转义

2、匹配一个字符

1. . 字符

  点字符 : 表明匹配任意一个字符  默认除了 \n 

      re.S模式可让 . 匹配\n  :  re.match(r"\d{3,5}.+", "123\nqq", "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 : 空白字符

3、量词

1.{}字符 : 匹配{m,n}, 至少m次 之多n次,  {m}m次

2.*字符 : 任意次

3.+字符 : 至少一次

4.?字符 : 0次或者1次

4、分组和位置

  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$", "123456@163.com").group()
re.match(r"^\w{4,16}@163\.com$|^\w{4,16}@263\.com$|^\w{4,16}@qq\.com$", "123456@qq.com").group()
re.match(r"^\w{4,16}@(163|263|qq)\.com$", "123456@263.com").group()
示例代码

5、函数

  match(正则,数据) - -> 匹配对象 从头匹配

  search(正则,数据) - -> 匹配对象 从头开始搜索  日后面尝试

  findall(正则,数据) --> 返回列表 查找全部

  sub(正则,替换数据,数据,次数) -- > 替换后的数据

html ="""
<div>
<p>岗位职责:</p>
<p>完成推荐算法、数据统计、接口、后台等服务器端相关工做</p>
<p><br></p>
<p>必备要求:</p>
<p>良好的自我驱动力和职业素养,工做积极主动、结果导向</p>
<p>&nbsp;<br></p>
<p>技术要求:</p>
<p>一、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式</p>
<p>二、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架</p>
<p>三、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种<br></p>
<p>四、掌握NoSQL、MQ,熟练使用对应技术解决方案</p>
<p>五、熟悉 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)
切割案例

6、贪婪,懒惰和字符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" 自动对数据中的\进行转义 ——> 双反斜杠 \

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息