深入浅析正则表达式re模块(部分)

正则表达式:

官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

​ 什么是正则表达式: 一套规则 - 匹配字符串的

​ 谈到正则,就只和字符串相关了。我们要考虑的是在同一个位置上可以出现的字符的范围。

​ 正则表达式能做什么:

•1.检测一个输入的字符串是否合法 -- web开发项目 表单验证 ◦用户输入一个内容的时候,我们要提前做检测
◦能够提高程序的效率并且减轻服务器的压力

•2.从一个大文件中找到所有符合规则的内容 -- 日志分析\爬虫 ◦能够高效的从一大段文字中快速找到符合规则的内容

字符组 : [字符组]

在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示。一个中括号只表示一个字符位置
 字符分为很多类,比如数字、字母、标点等等。假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。
     字符组 描述的是一个位置上能出现的所有可能性
    # 接受范围,可以描述多个范围,连着写就可以了
    # [abc]    一个中括号只表示一个字符位置,匹配a或者b或者c
    # [0-9]     匹配数字0-9,根据ASCII进行范围的比对
    # [a-z]     匹配所有的小写字母
    # [A-Z]     匹配所有的大写字母
    # [a-zA-Z]  匹配所有的大小写字母
    # [0-9a-z]
    # [0-9a-zA-Z_]

元字符:

字符:

元字符           匹配内容的规则
        .               匹配除换行符以外的任意字符
        \w              匹配字母或数字或下划线
        \s              匹配任意的空白符
        \d              匹配数字
        \n              匹配一个换行符
        \t              匹配一个制表符
        \b              匹配一个单词的结尾
        ^               匹配一个字符串的开始
        $               匹配一个字符串的结尾
        \W              匹配非字母或数字或下划线
        \D              匹配非数字
        \S              匹配非空白符
        a|b             匹配字符a或字符b
        a表达式|b表达式   匹配a或者b表达式中的内容,如果匹配a成功了,不会继续和b匹配, 所以,如果两个规则有重叠部分,总是把长的放在前面
        ()              分组,匹配括号内的表达式,也表示一个组。约束某一个元字符的作用范围,只在()内生效
        []              字符组,匹配字符组中的字符
        [^]             非字符组,匹配除了字符组中字符的所有字符
        在正则表达式中能够帮助我们表示匹配的内容的符号都是正则中的 元字符
        # [0-9]        -->  \d   表示匹配一位任意数字 digit
        # [0-9a-zA-Z_] -->  \w   表示匹配数字字母下划线 word
        # 空格 -->
        # tab  -->  \t
        # enter回车  -->  \n
        # 空格,tab和回车 --> \s  表示所有空白 包括空格 tab和回车
        # [\d]  \d  表示匹配数字
        # [\d\D] [\w\W] [\s\S]  表示匹配所有
        # [^\d]  匹配所有的非数字
        # [^1]  匹配除数字1以外的所有  
        # [1-9]\d 匹配两位整数
        # [1357]\d  匹配1,3,5,7,开头的两位整数
              例1:匹配多个网址:
             www\.oldboy\.com|www\.baidu\.com|www\.jd\.com|www\.taobao\.com     #\.表示取消.的特殊意义
             www\.(oldboy|baidu|jd|taobao)\.com    #用() 来约束 | 描述的内容的范围      
        记忆元字符 : 都是表示能匹配哪些内容,一个元字符总是表示一个字符位置上的内容
        # \d \w \s \t \n \D \W \S
        # [] [^] .
        # ^ $
        # | ()

量词:

量词  用法说明
        *      重复0次或更多次,表示0次或多次    {0,}
        +      重复1次或更多次,表示1次或多次    {1,}
        ?      重复0次或1次,表示匹配0次或1次    {0,1}
        {n}    重复n次,表示匹配n次
        {n,}   重复n次或更多次,表示匹配至少n次
        {n,m}  重复n到m次,表示至少匹配n次,至多m次
        例:
            匹配整数 \d+
            匹配小数 \d+\.\d+
            匹配整数或小数 : \d+\.?\d* #存在问题,比如1.也会被匹配到   --->  分组的作用 : \d+(\.\d+)?
        例:匹配手机号码,手机号以1开头,第二位为3-9,总共11位             
            1[3-9]\d{9}

#判断用户输入的内容是否合法,如果用户输入的对就能查到结果,如果输入的不对就不能查到结果
                 ^1[3-9]\d{9}$
            # 从一个大文件中找到所有符合规则的内容
                 1[3-9]\d{9}

转义符:

原本有特殊意义的字符,到了表达它本身的意义的时候,需要转义。

. 有特殊的意义,取消特殊的意义\.

有一些有特殊意义的内容,放在字符组中,会取消它的特殊意义
                #只表示符号本身
          [().*+?] 所有的内容在字符组中会取消它的特殊意义        
         #表示:a-c (a减c)
          [a\-c]  -在字符组中表示范围,如果不希望它表示范围,需要转义,或者放在字符组的最前面\最后面 。
 取消一个元字符的特殊意义有两种方法:
        1. 在这个元字符前面加\
        2. 对一部分字符生效,把这个元字符放在字符组里
            # [.()+?*]

贪婪匹配:

 1.贪婪匹配:在量词范围允许的情况下,尽量多的匹配内容
  .*x 表示匹配任意字符 任意多次数 遇到最后一个x才停下来
  回溯算法:
 2.非贪婪(惰性)匹配: 总是在量词范围内尽量少的匹配内容。前面的*,+等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
  .*?x 表示匹配任意字符 任意多次数 但是一旦遇到x就停下来
  .+?x 匹配任意内容至少1次 遇到x就停止
  元字符+量词+? ---> 惰性匹配
  几个常用的非贪婪匹配:
   *? 重复任意次,但尽可能少重复
   +? 重复1次或更多次,但尽可能少重复
   ?? 重复0次或1次,但尽可能少重复
   {n,m}? 重复n到m次,但尽可能少重复
   {n,}? 重复n次以上,但尽可能少重复
   例:匹配身份证号码:18/15位的身份证号
 # 15位:首位数字为1-9,总共15位
  [1-9]\d{14}
 # 18位:首位数字为1-9,末位为0-9或者X,总共18位
   [1-9]\d{16}[\dx]
   [1-9]\d{16}[0-9x]
 #1:
  [1-9]\d{16}[0-9x]|[1-9]\d{14}   #从一个大文件中找到所有符合规则的内容。表示先匹配[1-9]\d{16}[0-9x]如果没有匹配上就匹配[1-9]\d{14}
  ^([1-9]\d{16}[0-9x]|[1-9]\d{14})$  #检测一个输入的字符串是否合法
 #2:简化
  [1-9]\d{14}(\d{2}[\dx])?  #从一个大文件中找到所有符合规则的内容
  ^[1-9]\d{14}(\d{2}[\dx])?$  #检测一个输入的字符串是否合法 。()表示分组,将\d{2}[\dx]分成一组,就可以整体约束他们出现的次数为0-1次
  例:
 规则:1\d*?3 待匹配内容:1243333344  匹配结果:1243
 规则:1\d*3  待匹配内容:1243333344  匹配结果:12433333
re模块:
# findall 还是按照完整的正则进行匹配,只是显示括号里匹配到的内容。 取所有符合条件的,优先显示分组中的。
 ret = re.findall('9\d\d','19740ash93010uru')
 print(ret)#['974', '930']
 ret = re.findall('9(\d)\d','19740ash93010uru')
 print(ret)#['7', '3']
# search 还是按照完整的正则进行匹配,显示也显示匹配到的第一个内容,但是我们可以通过给group方法传参数,来获取具体分组,即()中的内容。
 search 只取第一个符合条件的,没有优先显示这件事儿
 得到的结果是一个变量
  变量.group() 的结果 完全和 变量.group(0)的结果一致
  变量.group(n) 的形式来指定获取第n个分组中匹配到的内容
 ret = re.search('9(\d)(\d)','19740ash93010uru')
 print(ret) # 变量 <_sre.SRE_Match object; span=(1, 4), match='974'>
 if ret:
  print(ret.group())#974 #ret.group(0) 0 默认不写
  print(ret.group(1))#7
  print(ret.group(2))#4
# 为什么在search中不需要分组优先 而在findall中需要?
 加上括号是为了对真正需要的内容进行提取。 为什么要用分组? 把想要的内容放分组里
 如果我们要查找的内容在一个复杂的环境中,我们要查的内容并没有一个突出的 与众不同的特点 甚至会和不需要的杂乱的数据混合在一起,这个时候我们就需要把所有的数据都统计出来,然后对这个数据进行筛选,把我们真正需要的数据对应的正则表达式用()圈起来,这样我们就可以筛选出真正需要的数据了。
# 如何取消分组优先
 如果在写正则的时候由于不得已的原因,导致不要的内容也得写在分组里,通过 ?: 取消这个分组的优先显示
 # (?:) 取消这个分组的优先显示
#findall
 ret = re.findall('<\w+>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')
 print(ret)#['askh930s02391j192agsj']
# search
 ret = re.search('<(\w+)>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')
 print(ret.group())#<h1>askh930s02391j192agsj</h1>
 print(ret.group(1))#h1
 print(ret.group(2))#askh930s02391j192agsj
#从exp中匹配出第一个加法,第一个减法, a+b 或者是a-b 并且计算他们的结果
  exp = '2-3*(5+6)'
  ret = re.search('(\d+)[+](\d+)',exp)
  print(ret)
  print(ret.group(1))#5
  print(ret.group(2))#6
  print(int(ret.group(1)) + int(ret.group(2)))#11
 #将豆瓣源码放到douban.html,从中获取电影名:
 with open('douban.html',encoding='utf-8') as f:
  content = f.read()
 ret = re.findall('<span class="title">(.*?)</span>(?:\s*<span class="title">.*?</span>)?',content)
 print(ret)
 #除了 霸王别姬,其他电影都是 肖申克的救赎 这种格式的。
 (.*?) 要显示的电影名 其中 ?是非贪婪匹配的标志
 (?:\s*<span class="title">.*?</span>)?
 ?: 取消这个分组的优先显示,整个()内都不显示  \s* 两行代码之间所有的空字符
 .*? 电影英文名         ? 该部分出现0次 或者1次
# 什么是爬虫
 # 通过代码获取到一个网页的源码,需要的是源码中嵌着的网页上的内容 -- 正则表达式
 #先安装扩展模块 File--Settings--Project Interpreter-- + --找到包---Install Package
 import requests
 ret = requests.get('https://movie.douban.com/top250?start=0&filter=')
 print(ret.content.decode('utf-8'))

总结

以上所述是小编给大家介绍的深入浅析正则表达式re模块(部分),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 浅谈python中的正则表达式(re模块)

    一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. 二.正则表达式中常用的字符含义 1.普通字符和11个元字符: 普通字符 匹配自身 abc abc . 匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符 a.c abc \ 转义字符,使后一个字符改变原来的意思 a\.c;a\\c a.c;a\c * 匹配前一个字

  • Python基础教程之正则表达式基本语法以及re模块

    什么是正则: 正则表达式是可以匹配文本片段的模式. 正则表达式'Python'可以匹配'python' 正则是个很牛逼的东西,python中当然也不会缺少. 所以今天的Python就跟大家一起讨论一下python中的re模块. re模块包含对正则表达式的支持. 通配符 .表示匹配任何字符: '.ython'可以匹配'python'和'fython' 对特殊字符进行转义: 'python\.org'匹配'python.org' 字符集 '[pj]ython'能够匹配'python'和'jython

  • python正则表达式re模块详细介绍

    本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮. 正则表达式使用反斜杆(\)来转义特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含义.这可能会和python字面意义上的字符串转义相冲突,这也许有些令人费解.比如,要匹配一个反斜杆本身,你也许要用'\\\\'来做为正则表达式的字符串,因为正则表达式要是\\,而字符串里,每个反斜杆都要写成\\. 你也可以在字符串前加上

  • PYTHON正则表达式 re模块使用说明

    首先,运行 Python 解释器,导入 re 模块并编译一个 RE: #!python Python 2.2.2 (#1, Feb 10 2003, 12:57:01) >>> import re >>> p = re.compile('[a-z]+') >>> p <_sre.SRE_Pattern object at 80c3c28> 现在,你可以试着用 RE 的 [a-z]+ 去匹配不同的字符串.一个空字符串将根本不能匹配,因为 +

  • python的正则表达式re模块的常用方法

    1.re的简介 使用python的re模块,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息.python 会将正则表达式转化为字节码,利用 C 语言的匹配引擎进行深度优先的匹配. 复制代码 代码如下: import re print re.__doc__ 可以查询re模块的功能信息,下面会结合几个例子说明. 2.re的正则表达式语法 正则表达式语法表如下: 语法 意义 说明 "." 任意字符 "^" 字符串开始

  • python正则表达式re模块详解

    快速入门 import re pattern = 'this' text = 'Does this text match the pattern?' match = re.search(pattern, text) s = match.start() e = match.end() print('Found "{0}"\nin "{1}"'.format(match.re.pattern, match.string)) print('from {0} to {1}

  • Python的re模块正则表达式操作

    这个模块提供了与 Perl 相似l的正则表达式匹配操作.Unicode字符串也同样适用. 正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\\\ "表示正则表达式中的" \ ",因为正则表达式中如果要匹配" \ ",需要用\来转义,变成" \\ ",而Python语法中又需要对字符串中每一个\进行转义,所以就变成了" \\\\ &

  • 深入浅析正则表达式re模块(部分)

    正则表达式: 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑. ​ 什么是正则表达式: 一套规则 - 匹配字符串的 ​ 谈到正则,就只和字符串相关了.我们要考虑的是在同一个位置上可以出现的字符的范围. ​ 正则表达式能做什么: •1.检测一个输入的字符串是否合法 -- web开发项目 表单验证 ◦用户输入一个内容的时候,我们要提前做检测

  • 浅析正则表达式中的lastIndex以及预查

    依次写出下列输出内容. var reg1 = /a/; var reg2 = /a/g; console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg2.test('abcabc')); //

  • 详解Python正则表达式re模块

    正则是处理字符串最常用的方法,我们编码中到处可见正则的身影. 正则大同小异,python 中的正则跟其他语言相比略有差异: 1.替换字符串时,替换的字符串可以是一个函数 2.split 函数可以指定分割次数,这会导致有个坑 3.前项界定的表达式必须定长 下面详细描述下 re 模块的使用方法,其实,注意上面提到的三点差异就好 1.match 说明: re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回 None. 语法: re.match(pat

  • 浅析Python requests 模块

    Python requests 模块 requests 模块是我们使用的 python爬虫 模块 可以完成市场进80%的爬虫需求. 安装 pip install requests 使用 requests模块代码编写的流程: - 指定url - 发起请求 - 获取响应对象中的数据 - 持久化存储 -------------案例------------------------- import requests # 指定url url="https://www.sogou.com/" # 发

  • python正则表达式(re模块)的使用详解

    目录 前言 re.match函数 匹配单个字符 匹配多个字符 匹配开头结尾 匹配分组 re.compile函数 re.search函数 re.findall函数 re.finditer函数 re.sub函数 re.subn函数 re.split函数 python贪婪和⾮贪婪 r的作⽤ 总结 前言 在Python中需要通过正则表达式对字符串进⾏匹配的时候,可以使⽤⼀个python自带的模块,名字为re. 正则表达式的大致匹配过程是: 1.依次拿出表达式和文本中的字符比较, 2.如果每一个字符都能匹

  • Python正则表达式re模块详解(建议收藏!)

    目录 前言 match 匹配字符串 单字符匹配 . 匹配任意一个字符 \d 匹配数字 \D 匹配非数字 \S 匹配非空白 \w 匹配单词.字符,如大小写字母,数字,_ 下划线 \W 匹配非单词字符 [ ] 匹配[ ]中列举的字符 表示数量 * 出现0次或无数次 + 至少出现一次 ? 1次或则0次 {m,} 至少出现m次 匹配边界 $ 匹配结尾字符 ^ 匹配开头字符 \b 匹配一个单词的边界 \B 匹配非单词边界 匹配分组 | 匹配左右任意一个表达式 (ab) 将括号中字符作为一个分组 searc

  • Python正则表达式re模块讲解以及其案例举例

    目录 一.re模块简介 二.正则表达式的基本概念 1.正则表达式的语法介绍: 2.Python中的正则表达式模块 3.re模块的部分方法 三.正则表达式使用的实例 总结 一.re模块简介 Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,和 Perl 脚本的正则表达式功能类似,使用这一内嵌于 Python 的语言工具,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息. 二.正则表达式

随机推荐