正则表达式在程序开发中会经常用到,比如数据(格式)验证、替换字符内容以及提取字符串内容等等情况都会用到,但是目前许多开发人员对于正则表达式只是处于了解或者是基本会用的阶段。一旦遇到大批量使用正则表达式的情况(例如网络爬虫)可以说基本上就抓瞎了。这篇文章我将带领大家利用 Python 来学习一下正则表达式。在阅读这篇文章前你需要掌握 Python 基础知识,或者具有其他开发语言的基础知识也可以,因为基本上每种语言使用正则表达式的方式都是类似的。

零、正则表达式基础

1.提取字符(串) 有时我们需要从一个字符串中获取一段内容,这段内容可能是一个字符也可能是一段字符串,如果用逐字对比遍历的话不仅耗时耗力而且还容易出错。那么这个时候我们就可以用到正则表达式中的 字符匹配 功能。正则表达式为我们提供了 4 种字符匹配的方法,见下表:

语法 说明 例子 可匹配字符串 . 匹配除了换行符 “\n” 以外的任意字符 a.b acb、adb、a2b、a~b 转义,将转移字符后面的一个字符改变原来的意思 a[b\.\\]c abc、a.c、a\c [] 匹配括号内的任意字符 a[b,c,d,e]f abd、acf、adf、aef [^] 除了括号内的字符外,其他的字符都匹配 aa,b,c,d,ef a1f、a#f、azf、agf

2.预定义字符 所谓预定义字符就是正则表达式中为我们预留的专门用来匹配格式化内容的字符,例如匹配数字用的 \d 和匹配空白符的 \s 等等。我们可以利用预定义字符快速的匹配出一个字符串中符合要求的内容。预定义字符匹配的内容,同样也可以利用前面所讲的字符匹配的方式匹配出来,但是代码量会相对来说多一点。下表所列的就是预定义字符:

语法 说明 例子 可匹配字符串 ^ 以什么字符串开始 ^123 123abc、123321、123zxc $ 以什么字符串结尾 123$ abc123、321123、zxc123 \b 匹配单词边界,不匹配任何字符 \basd\b asd \d 匹配数字0-9 zx\dc zx1c、zx2c、zx5c \D 匹配非数字 zx\Dc zxvc、zx$c、zx&c \s 匹配空白符 zx\sc zx c \S 匹配非空白符 zx\Sc zxac、zx1c、zxtc \w 匹配字母、数字和下划线 zx\wc zxdc、zx1c、zx_c \W 匹配非字母、数字和下划线 zx\Wc zx c、zx$c、zx(c

在预定义字符中有如下几点需要注意:

  • \b 匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。\b 是零宽度。
  • \w 在不同编码语言中匹配的范围是不一样的,在使用 ASCII 码的语言中匹配的是 [a-zA-Z0-9] ,而在使用 Unicode 码的语言中匹配的是 [a-zA-Z0-9] 和汉字、全角符号等特殊字符。

3.限制数量 在某些情况下我们需要匹配重复的内容,这时我们可以使用 数量限定 模式来进行操作。数量限定如下表: 

语法 说明 例子 可匹配字符串 * 匹配0到多次 zxc* zx、zxccccc + 匹配1次到多次 zxc+ zxc、zxccccc "table_row" cid="n116"> {m} 匹配m次 zxc{3}vb zxcccvb {m,} 匹配m次或多次 zxc{3,}vb zxcccvb、zxccccccccvb {,n} 匹配0次到n次 zxc{,3}vb zxvb、zxcvb、zxccvb、zxcccvb {m,n} 匹配m次到n次 zxc{1,3} zxcvb、zxccvb、zxcccvb

4.断言 断言,又称零宽断言,指的是当断言表达式为 True 时才进行匹配,但是并不匹配断言表达式内容。和 ^ 代表开头, $ 代表结尾, \b 代表单词边界一样,先行断言和后行断言也有类似的作用,它们只匹配某些位置,在匹配过程中,不占用字符,所以被称为零宽。所谓位置,是指字符串中第一个字符的左边、最后一个字符的右边以及相邻字符的中间。零宽断言表达式有四种:

  • 零宽度负回顾后发断言 ("table_row" cid="n152"> 语法 说明 *"table_row" cid="n158"> +"table_row" cid="n161"> "table_row" cid="n164"> {m,}"table_row" cid="n167"> {m,n}"color: #ff0000">一、Python 使用正则表达式

    在 Python 中使用正则表达式很简单,re 模块向我们提供了正则表达式的支持。使用步骤一共三步:

    • 将正则表达式字符串转换为 Pattern 的实例;
    • 使用 Pattern 实例去处理要匹配的字符,匹配结果是一个 Match 实例;
    • 利用 Match 实例去进行之后的操作。

    在 Python 中我们常用的 re 的方法有六种,分别是: compile 、 match 、 search 、 findall 、 split 和 sub ,下面就针对这六种方法进行一下讲解。

    compile compile 方法的作用是将正则表达式字符串转化为 Pattern 实例,它具有两个参数 pattern 和 flags ,pattern 参数类型是 string 类型,接收的是正则表达式字符串,flags 类型是 int 类型,接收的是匹配模式的编号,flags 参数是非必填项,默认值为 0 (忽略大小写)。flags 匹配模式有如下 6 种: 

    匹配模式 说明 re.I 忽略大小写 re.M 多行匹配模式 re.S 任意匹配模式 re.L 预定义字符匹配模式 re.U 限定字符匹配模式 re.V 详细模式

    上述六种模式在实际开发中很少用到,我们只需要了解即可。 使用 compile 很简单,如下: 

    import re "htmlcode">
    
    import re "没匹配上") "2019年01月23日大会开始" 
      getMatch(message) 
      message = "会议于2019-01-23召开" 
      getMatch(message) 
    

    在代码中我们使用了 groups 方法,这个方法用来获取匹配出来的字符串组。到这里过一会有很多读者感到纳闷,为什么第一段内容能匹配出来年月日,而第二段内容不能呢?这是因为 match 方法是从字符串的起始位置匹配的。 代码运行结果如图:

    Python正则表达式急速入门(小结)

    3.search search 方法与 match 方法功能是一样的,只不过 search 方法是对整个字符串进行匹配。将前一小节代码中的 getMatch 方法进行改动,即可将第二段内容中的年月日匹配出来。

    import re "没匹配上") "2019年01月23日大会开始" 
      getMatch(message) 
      message = "会议于2019-01-23召开" 
      getMatch(message) 
    

    上述代码运行结果如下图:

    Python正则表达式急速入门(小结)

    4.findall findall 方法的作用是匹配整个字符串,以列表的形式返回所有匹配结果。

    import re "没匹配上") "my name is 张三" 
      getMatch(message) 
      message = "张三 is me" 
      getMatch(message) 
    

    代码运行结果如下图:

    Python正则表达式急速入门(小结)

    5.split split 方法是利用指定的字符来分割字符串。

    import re "没匹配上") "2018-9-12" 
      getMatch(message) 
      message = "第一步-第二步-第三步-第四步-and more" 
      getMatch(message) 
    

    上述代码运行结果如下图:

    Python正则表达式急速入门(小结)

    6.sub sub 方法用来替换字符串,它接受5个参数,其中常用的有三个:

    • pattern,Pattern 实例
    • string,等待替换的字符串
    • repl,表示替换的新字符串或需要执行的替换方法
    • count,替换次数,默认为0表示全部替换
    import re "your 年龄 " 
      pattern=re.compile(r'\w+') 
      print(re.sub(pattern,getMatch,message)) 
    

    代码运行结果如下图:

    Python正则表达式急速入门(小结)

    三、总结

    Python 中正则表达式使用起来非常方便,上面所展示的代码,完全可以直接复制出来稍加修改后放在项目中使用。内容不多,主要是讲解代码怎么使用,希望大家完全理解掌握了正则表达式的写法。

    作者简介:
    朱钢,笔名喵叔,国内某技术博客认证专家,.NET高级开发工程师,7年一线开发经验,参与过电子政务系统和AI客服系统的开发,以及互联网招聘网站的架构设计,目前就职于一家初创公司,从事企业级安全监控系统的开发。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

标签:
Python,正则表达式

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
评论“Python正则表达式急速入门(小结)”
暂无“Python正则表达式急速入门(小结)”评论...

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。