• 【python】一篇玩转正则表达式


    cc8b9af695d241f1abcc6a424efd5529.jpeg

    目录

    前言

    正则表达式

    行定位符

    1.^

    2.$

    元字符

    常见的元字符

    限定符

    常用的限定符

    字符类

    排除字符

    选择字符

    转义字符

    ()

    python使用正则表达式

    匹配字符串

    match()

    search()

    findall()

    sub()

    替换敏感字符

     split()


    3d308fb387994e878f3968be162983ed.gif

    前言

    正则表达式(Regular Expression),又称规则表达式,它不是某个编程语言所特有的,是计算机科学的一个概念,通常被用来检索和替换符合某些规则的文本。

    正则表达式

    行定位符

    1.^

    表示行的开始

    2.$

    表示行的结尾

    举例

    ^py该表达式表示要匹配字符串py的开始位置是行头,如py equal python可以匹配而python equal py不能匹配

    py$后者可以匹配,前者不能,如果要匹配的字符串可以出现在字符串的任意部分,那么可以直接写成py

    元字符

    常见的元字符

    元字符说明
    .匹配除换行符以外的任意字符
    \w匹配字母或数字或下划线或汉字
    \s匹配任意的空白符
    \d匹配数字
    \b匹配单词的开始或结束
    ^匹配字符串的开始
    $匹配字符串的结束

    限定符

    如果想匹配特定数量的数字,需要使用限定符(指定数量的字符)来实现,例如匹配8位QQ号就是:^\d{8}$

    ^表示行的开始,\d表示匹配数字,{8}就是限定符表示匹配前面的字符8次,$表示行的结束

    常用的限定符

    限定符说明举例
    匹配前面的字符零次或一次pytho?n,可以匹配为python或pythn
    +匹配前面的字符一次或多次py+thon,可以匹配为python到pyy...thon
    *匹配前面的字符零次或多次py*thon,可以匹配为pthon到pyy...thon
    {n}匹配前面的字符n次py{2}thon,只能匹配pyython
    {n,}匹配前面的字符最少n次py{2,,}thon,可以匹配pyython到pyy...thon
    {n,m}匹配前面的字符最少n次,最多m次python{0,2},可以匹配pytho、python、pythonn三种情况

    字符类

    正则表达式查找数字和字母是简单的事,因为有元字符,但是如果没有预定义元字符的字符合集(比如元音字母),那该怎么办呢?

    也简单,在方括号里列出他们,[aeiou]就是匹配元音字母,[0-9]代表的含义就和\d完全一致,代表一个数字,[a-z0-9A-Z_]等同于\w(不考虑汉字),如果想匹配任意一个汉字,可以使用[\u4e00-\u9fa5],匹配多个汉字,只需在前面的基础上加个+即[\u4e00-\u9fa5]+

    排除字符

    匹配不符合指定字符集合的字符串,^放在方括号表示排除的意思

    举例

    [^a-zA-Z]表示匹配一个不是字母的字符

    选择字符

    如果我们想要它匹配的结果是多种,就需要使用选择字符(|)该字符是或的意思

    举例

    身份证的长度为15位或18位,其中15位全为数字,18位分为全为数字和前17位为数字最后一位可能是数字或字符X,那么匹配的表达式可写为:

    (^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$

    转义字符

    转义字符的作用就是将特殊字符(如“.”“?”“\”)变为普通的字符,例如匹配QQ邮箱

    ^[1-9]\d{4,10}@qq\.com$

    括号在正则表达式也算是元字符

    ()

    作用一:改变限定符的作用范围

    作用二:分组,也就是子表达式(\.[0,9]{1,4}){4},就是对其进行重复操作

    python使用正则表达式

    匹配字符串

    match()

    从字符串的开始处进行匹配,如果起始位置匹配成功,则返回Match对象,否则返回None。语法格式如下:

    re.match(pattern,string,[flags])

    pattern:表示模式字符串,由要匹配的正则表达式转换而来

    string:表示要匹配的字符串

    flags:表示标志位,用于控制匹配方式,如是否区分字母大小写

    常用标志

    标志说明

    A或ASCII

    对\w,\b,\d,\s只进行ASCII匹配
    I或IGNORECASE不区分字母大小写
    M或MULTILINE将^和$用于包括整个字符串的开始和结尾的每一行
    S或DOTALL使用“.”字符匹配所有字符,包括换行符
    X或VERBOSE忽略模式字符串中未转义的空格和注释

    举例

    匹配字符串是否以“mr_”开头,不区分字母大小写

    代码

    1. import re
    2. pattern='mr_\w+'
    3. string='MR_SHOP mr_shop'
    4. match=re.match(pattern,string,re.I)
    5. print(match)
    6. print('匹配值的起始位置:',match.start())
    7. print('匹配值的结束位置:',match.end())
    8. print('匹配位置的元组:',match.span())
    9. print('要匹配的字符串:',match.string)
    10. print('匹配数据:',match.group())
    11. string='名称 MR_SHOP mr_shop'
    12. match=re.match(pattern,string,re.I)
    13. print(match)

    执行结果

    a0a27de04545422794cb44c55c38e063.png

    search()

    在整个字符串中搜索第一个匹配的值,如果在起始位置匹配成功,则返回Match(),否则返回None,语法格式如下:

    re.search(patter,string,[flags])

    pattern:表示模式字符串,由要匹配的正则表达式转换而来

    string:表示要匹配的字符串

    flags:表示标志位,用于控制匹配方式,如是否区分字母大小写

     举例

    搜索第一个以“mr_”开头的字符串,不区分字母大小写

    代码

    1. import re
    2. pattern='mr_\w+'
    3. string='MR_SHOP mr_shop'
    4. search=re.search(pattern,string,re.I)
    5. print(search)
    6. string='名称 MR_SHOP mr_shop'
    7. search=re.search(pattern,string,re.I)
    8. print(search)

    执行结果

    039bb1629a2544a2b3304041b9ad394b.png

    findall()

    在整个字符串中搜索 所有符合正则表达式的字符串,并以列表的形式返回,如果匹配成功,则返回包含匹配结构的列表,否则返回空列表,语法格式如下:

    re.findall(pattern,string,[flags])

    pattern:表示模式字符串,由要匹配的正则表达式转换而来

    string:表示要匹配的字符串

    flags:表示标志位,用于控制匹配方式,如是否区分字母大小写

    举例

    搜索以“mr_”开头的字符串

    代码

    1. import re
    2. pattern='mr_\w+'
    3. string='MR_SHOP mr_shop'
    4. findall=re.findall(pattern,string,re.I)
    5. print(findall)
    6. string='名称 MR_SHOP mr_shop'
    7. findall=re.findall(pattern,string)
    8. print(findall)

    执行结果

    8398468705c1417c990f69a4cbfe6e2f.png

    sub()

    实现字符串替换,语法格式如下:

    re.sub(patter,repl,string,count,flags)

    pattern:表示模式字符串,由要匹配的正则表达式转换而来

    repl:表示替换的字符串

    string:表示要被查找替换的原始字符串

    count:可选参数,表示模式匹配后替换的最大次数,默认值为0

    flags:表示标志位,用于控制匹配方式,如是否区分字母大小写

    举例

    隐藏快递里的手机号码

    代码

    1. import re
    2. pattern='1[34578]\d{5}'
    3. string='快递号:7-1563 联系电话:18888358853'
    4. result=re.sub(pattern,'1XXXXXX',string)
    5. print(result)

    执行结果

    5602d53a3db94021b5b719ddd3a83c80.png

    替换敏感字符

    代码

    1. import re
    2. pattern='淘宝'
    3. string='我在淘宝买东西'
    4. result=re.sub(pattern,'某宝',string)
    5. print(result)

     执行结果

    18ebf94d4d7a4a0dbd6fb5023b792182.png

     split()

    根据正则表达式分割字符串,并以列表的形式返回,语法格式如下:

    re.split(pattern,string,[maxsplit],[flags])

    pattern:表示模式字符串,由要匹配的正则表达式转换而来

    string:表示要匹配的字符串

    maxsplit:可选参数,表示最大的拆分次数

    flags:表示标志位,用于控制匹配方式,如是否区分字母大小写

    举例

    对给定的url地址中提取请求地址和各个参数

    代码

    1. import re
    2. pattern='[?|&]'
    3. url='http://www.baidu.com/login?username="zhangsan"&pwd="password"'
    4. result=re.split(pattern,url)
    5. print(result)

    执行结果

    a3415c4f2d034abf9ae52ec2a504de59.png

    👍+✏️+⭐️是对博主最大的鼓励与支持!!!

    我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2stnq0z9t76ss

  • 相关阅读:
    Azure Container App(一)应用介绍
    Servlet篇 —— 我的第一个Servlet程序
    c++ SFML ftp切换工作目录并且重命名目录
    java的单元测试和反射
    Axios入门
    【区块链 | Compound】1.剖析DeFi借贷产品之Compound:概述篇
    买阿里云服务器,实操搭建nginx+php+thinkphp5全过程(1)
    leetcode:53. 最大子数组和
    【SpringBoot框架篇】28.使用JdbcTemplate操作数据库
    获取ArcGISPro中conda信息详情
  • 原文地址:https://blog.csdn.net/m0_67388084/article/details/127859088