正则表达式学习笔记

正则表达式

主要内容

  • 正则表达式简介
  • 匹配单个字符、多个字符、开头结尾、分组
  • re模块
  • 应用演练

正则表达式简介

正则表达式(Regular Expression)是一种文本模式。基于正则表达式(文本模式)可以对字符串这类非结构化数据进行模式验证、文本替换以及子字符串提取。

正则表达式可以用于:

  • 验证字符串的模式

    测试输入字符串是否符合电话号码或信用卡号码模式。称为数据验证。

  • 替换文本

  • 基于模式匹配从字符串中提取子字符串

    字符串为一种非结构化类型,可以通过提取子字符串的方式对字符串数据进行清洗

正则表达式示例:

上式的正则表达式用以匹配一个或多个数字开头并以abc结尾的字符串,其中:

  • ^[0-9]+表示匹配一个多个数字开头的字符串
  • abc$表示匹配以abc结尾的字符串

匹配单个字符、多个字符、开头结尾、分组

  • 匹配单个字符
字符功能
.匹配任意一个字符(除了\n)
\d匹配任意数字,等价于[0-9]
\D匹配任意非非数字
\s匹配任意空白字符等价[\t\n\r\f]
\S匹配任意非空白字符
\w匹配单词字符,等价[a-zA-Z_]同时也包括任意汉字
\W匹配非单词字符
[...]匹配[]中的一个字符
[^...]匹配不在[]中的字符
  • 匹配多个字符
字符功能
*匹配前一个字符出现0次或者无限次,即可有可无
+匹配前一个字符出现0次或者无限次,即一次或多次
匹配前一个字符出现0次或多次,即存在或不存在
{m}匹配前一个字符出现m次
{m, n}匹配前一个字符出现m次到n次

python中数量词默认是贪婪,总尝试匹配尽可能多的字符;在"*","+","?"后加上"?"可以要求正则匹配越少越好

>>>re.match(r"aa(\d+)", "aa123bbbb").group()  #方法group用于输出匹配结果
>>>"aa123"
>>>re.match(r"aa(\d+?)", "aa123bbbb").group()  #方法group用于输出匹配结果
>>>"aa1"

python中正则表达式前r的作用

r表示原生字符串,用以解决转义字符""的困扰。假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\":前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

>>> ret = re.match("c:\\\\a","c:\\a").group()  #需要4个反斜杠
>>> print(ret)
c:\a
>>> ret = re.match(r"c:\\a",mm).group()  #只需要2个放斜杠
>>> print(ret)
c:\a
  • 匹配开头与结尾
字符功能
^匹配字符串开头(行首)
$匹配字符串结尾(行尾)
  • 匹配分组

分组后使用方法.group()可以提取相应匹配的字符串。

字符功能
|匹配左右任意一个表达式
(ab)将括号中字符作为一个分组
\num引用非组num匹配到的字符串
(?p)分组起别名
(?P=name)引用别名为name分组匹配到的字符串

re模块

re模块使python拥有全部的正则表达式功能,re中的函数有:

  • re.match(pattern, string, flags=0)

    • pattern为要匹配的正则表达式
    • string为要匹配的字符串
    • flags标志位用于控制多行匹配等匹配方式。

    re.match()返回一个对象,通过re.match().group()可以返回匹配的字符串。

  • re.search()

    • 与re.match()区别:re.match()需要字符串首个字符与正则表达式中的一致,匹配字符串开头,相当于正则表达式开头中省略了"^";而re.search()则不需。
  • re.findall()

    • 匹配的所有子串,并返回一个列表

    注意: match 和 search 是匹配一次 findall 匹配所有。

  • re.finditer()

    • 与findall类似,但返回一个迭代器
  • re.sub(pattern, repl, string, count=0, flags=0)

    • repl:替换的字符串,也可为一个函数
    • count:模式匹配后替换的最大次数,默认0为替换所有的匹配。
  • re.split()

    • 将字符串分割后返回列表
  • re.compile(pattern, flags)

    compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

应用演练

  • 验证字符串模式

    • 变量明命名是否正确

      import re
      
      def main():
          """
          变量名由字母、下划线或者数字组成并且以字母或下划线开头。
          """
          
      	names = ["_aabb", "abd123", "abd123!", "1122ccc", "1_cc"]
          pattern = re.compile(r"[a-zA-Z_][a-zA-Z_0-9]*$")  #注意需加$匹配结尾
        for name in names:
              ret = re.match(pattern, name)  #re.match返回一个对象,如果未匹配返回none
              if ret: print("变量名%s正确" % name)
              else: print("变量名%s不正确" % name)
              
      if __name__ == "__main__":
          main()
      
  • 替换文本

    • 对re.sub()中传入函数

      import re
      
      def double(matched):
          """
          将re.sub()中匹配的字符串数字乘以2并返回。
          matched接受一个re.sub()返回的对象。
          """
          value = int(matched.group('value'))  #value为分组的引用
          return str(value * 2)
      
      def main():
          test_str = "adfa125adfa"
          pattern = re.compile(r"(?P<value>\d+)")
          print(re.sub(pattern, double, test_str))
      
      if __name__ == "__main__":
          main()
      
      >>>adfa250adfa
      
    • 对字符串进行清洗

      import re
      
      def main():
          """
      删除test_str中的标签,换行符
      """
          
          test_str = """
      <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>
      """
          
          pattern = re.compile(r"<[^>]*>|&nbsp;|\n")
          print(re.sub(pattern, "", test_str))
       
      if __name__ == "__main__":
      	main()
      
      岗位职责:完成推荐算法、数据统计、接口、后台等服务器端相关工作必备要求:良好的自我驱动力和职业素养,工作积极主动、结果导向技术要求:1、一年以上 Python 开发经验,掌握面向对象分析和设计,了解设计模式2、掌握HTTP协议,熟悉MVC、MVVM等概念以及相关WEB开发框架3、掌握关系数据库开发设计,掌握 SQL,熟练使用 MySQL/PostgreSQL 中的一种4、掌握NoSQL、MQ,熟练使用对应技术解决方案5、熟悉 Javascript/CSS/HTML5,JQuery、React、Vue.js加分项:大数据,数理统计,机器学习,sklearn,高性能,大并发。      
      
  • 提取子字符串

    • 提取序号和电话号码切割字符串

      >>> ret = re.match("([^-]*)-(\d+)", "123-12345678")
      >>> ret.group(1)  #区号
      >>> ret.group(2)  #电话号码
      

参考文献

正则表达式

常用正则表达式

Python3 正则表达式

正则表达式修饰符 - flags标志位

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值