正则表达式

应用场景

  • 特定规律字符串的查找替换切割等

  • 邮箱格式、url等格式的验证

  • 爬虫项目,提取特定的有效内容

  • 很多应用的配置文件

使用原则

  • 只要能够通过字符串等相关函数能够解决的,就不要使用正则

  • 正则的执行效率比较低,会降低代码的可读性

  • 世界上最难读懂的三样东西:医生的处方、道士的神符、码农的正则

  • 提醒:正则是用来写的,不是用来读的,不要试着阅读别人的正则;不懂功能时必要读正则。

基本使用

  • 说明:正则是通过re模块提供支持的

  • 相关函数:

    • match:从开头进行匹配,找到就立即返回正则结果对象,没有就返回None

    • search:匹配全部内容,任意位置,只要找到,立即返回正则结果对象,没有返回None

      # python依赖次模块完成正则功能
      import re# 从开头进行匹配,找到一个立即返回正则结果对象,没有返回None
      m = re.match('abc', 'abchelloabc')
      # 匹配全部内容,任意位置,只要找到,立即返回正则结果对象,没有返回None
      m = re.search('abc', 'helloabcshsjsldj')
      if m:
          print('ok')
          # 获取匹配内容
          print(m.group())
          # 获取匹配位置
          print(m.span())
    • findall:匹配所有内容,返回匹配结果组成的列表,没有返回None

      # 匹配所有内容,返回匹配结果组成的列表,没有返回None
      f = re.findall('abc', 'abcsdisuoiabcsjdklsjabc')
      if f:
          print(f)
    • compile:根据字符串生成正则表达式的对象,用于特定正则匹配,通过match、search、findall匹配

      # 根据字符串生成正则表达式的对象,用于正则匹配
      c = re.compile('abc')
      # 然后进行特定正则匹配
      # m = c.match('abcdefghijklmn')
      m = c.search('abcdefghijklmn')
      if m:
          print(m)
      ​
      print(c.findall('abcueywiabcsjdkaabc'))

      将re模块中的match、search、findall方法的处理过程分为了两步完成。

正则规则

  • 单个字符

    普通字符:就是一对一的完全匹配
    []:中间的任意一个字符
        [a-z]:表示a到z的任意字符
        [0-9]:表示0到9的任意字符
        [^abc]:除abc之外的字符
    . :匹配'\n'以外的任意字符
    \d:所有的数字字符,等价于[0-9]
    \D:所有的非数字字符,等价于[^0-9]
    \w:所有的数字、字母、中文、下划线等 (就是字的意思)
    \W:\w之外的所有字符
    \s:所有的空白字符,如:空格、\t、\n、\r
    \S:\s之外的所有字符
    \b:词边界,如:开头、结尾、标点、空格等
    \B:非词边界
  • 次数控制

    *:前面的字符可以是任意次
    +:前面的字符至少出现一次
    ?:至多一次,0次或1次
    {m}:匹配固定的m次
    {m,}:至少m次
    {m,n}:m到n次

    正则的匹配默认是贪婪的

  • 边界限定

    • ^:以指定内容开头

    • $:以指定内容结尾

    import re# 以指定内容开头
    # c = re.compile(r'^abc')
    # 以指定内容结尾
    # c = re.compile(r'abc$')
    # 同时限制开头和结尾
    c = re.compile(r'^abc$')
    ​
    s = c.search('abc')
    ​
    if s:
        print('ok')
        print(s.group())
  • 分组匹配

    • |:表示或,具有最低的优先级

    • ():用于表示一个整体,可以确定优先级

    import re# | 表示或,具有最低的优先级
    # () 用于表示一个整体,可以确定优先级
    c = re.compile(r'a(hello|world)d')
    ​
    s = c.search('aworldd')
    ​
    if s:
        print('ok')
        print(s.group())


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值