码迷,mamicode.com
首页 > 其他好文 > 详细

正则表达式

时间:2018-11-24 22:29:46      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:面向对象   下标   增加   设计模式   group   ack   非贪婪   pytho   css   

正则表达式

一、正则介绍

二、匹配一个字符

三、量词

四、分组和位置

五、函数

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

回到顶部

 

一、正则介绍

1.作用

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

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

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

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

?     如果匹配失败 返回None

  获取匹配结果

?     匹配结果对象.group()

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

二、匹配一个字符

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 : 空白字符

三、量词

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$", "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()
示例代码

五、函数

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

 

正则表达式

标签:面向对象   下标   增加   设计模式   group   ack   非贪婪   pytho   css   

原文地址:https://www.cnblogs.com/Mryang123/p/10013646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!