Python正则表达式知识汇总

1. 正则表达式语法

  1.1 字符与字符类
     1 特殊字符:\.^$?+*{}[]()|
      以上特殊字符要想使用字面值,必须使用\进行转义
     2 字符类
         1. 包含在[]中的一个或者多个字符被称为字符类,字符类在匹配时如果没有指定量词则只会匹配其中的一个。
       2. 字符类内可以指定范围,比如[a-zA-Z0-9]表示a到z,A到Z,0到9之间的任何一个字符
       3. 左方括号后跟随一个^,表示否定一个字符类,比如[^0-9]表示可以匹配一个任意非数字的字符。
       4. 字符类内部,除了\之外,其他特殊字符不再具备特殊意义,都表示字面值。^放在第一个位置表示否定,放在其他位置表示^本身,-放在中间表示范围,放在字符类中的第一个字符,则表示-本身。

      5. 字符类内部可以使用速记法,比如\d \s \w
    3 速记法
       . 可以匹配除换行符之外的任何字符,如果有re.DOTALL标志,则匹配任意字符包括换行
       \d 匹配一个Unicode数字,如果带re.ASCII,则匹配0-9
      \D 匹配Unicode非数字
       \s 匹配Unicode空白,如果带有re.ASCII,则匹配\t\n\r\f\v中的一个
       \S 匹配Unicode非空白
       \w 匹配Unicode单词字符,如果带有re.ascii,则匹配[a-zA-Z0-9_]中的一个
       \W 匹配Unicode非单子字符

  1.2 量词
     1. ? 匹配前面的字符0次或1次
     2. * 匹配前面的字符0次或多次
     3. + 匹配前面的字符1次或者多次
     4. {m} 匹配前面表达式m次
     5. {m,} 匹配前面表达式至少m次
     6. {,n} 匹配前面的正则表达式最多n次
     7. {m,n} 匹配前面的正则表达式至少m次,最多n次
     注意点:
       以上量词都是贪婪模式,会尽可能多的匹配,如果要改为非贪婪模式,通过在量词后面跟随一个?来实现

  1.3 组与捕获
     1 ()的作用:
       1. 捕获()中正则表达式的内容以备进一步利用处理,可以通过在左括号后面跟随?:来关闭这个括号的捕获功能
      2. 将正则表达式的一部分内容进行组合,以便使用量词或者|
    2 反响引用前面()内捕获的内容:
       1. 通过组号反向引用
         每一个没有使用?:的小括号都会分配一个组好,从1开始,从左到右递增,可以通过\i引用前面()内表达式捕获的内容
       2. 通过组名反向引用前面小括号内捕获的内容
         可以通过在左括号后面跟随?P<name>,尖括号中放入组名来为一个组起一个别名,后面通过(?P=name)来引用 前面捕获的内容。如(? P<word>\w+)\s+(?P=word)来匹配重复的单词。
     3 注意点:
       反向引用不能放在字符类[]中使用。

   1.4 断言与标记
     断言不会匹配任何文本,只是对断言所在的文本施加某些约束
     1 常用断言:
       1. \b 匹配单词的边界,放在字符类[]中则表示backspace
      2. \B 匹配非单词边界,受ASCII标记影响
       3. \A 在起始处匹配
       4. ^ 在起始处匹配,如果有MULTILINE标志,则在每个换行符后匹配
       5. \Z 在结尾处匹配
       6. $ 在结尾处匹配,如果有MULTILINE标志,则在每个换行符前匹配
       7. (?=e) 正前瞻
       8. (?!e) 负前瞻
       9. (?<=e) 正回顾
       10.(?<!e) 负回顾
     2 前瞻回顾的解释
       前瞻: exp1(?=exp2) exp1后面的内容要匹配exp2
      负前瞻: exp1(?!exp2) exp1后面的内容不能匹配exp2
      后顾: (?<=exp2)exp1 exp1前面的内容要匹配exp2
      负后顾: (?<!exp2)exp1 exp1前面的内容不能匹配exp2
      例如:我们要查找hello,但是hello后面必须是world,正则表达式可以这样写:"(hello)\s+(?=world)",用来匹配"hello wangxing"和"hello world"只能匹配到后者的hello

  1.5 条件匹配
     (?(id)yes_exp|no_exp):对应id的子表达式如果匹配到内容,则这里匹配yes_exp,否则匹配no_exp

  1.6 正则表达式的标志
     1. 正则表达式的标志有两种使用方法
       1. 通过给compile方法传入标志参数,多个标志使用|分割的方法,如re.compile(r"#[\da-f]{6}\b", re.IGNORECASE|re.MULTILINE)
      2. 通过在正则表达式前面添加(?标志)的方法给正则表达式添加标志,如(?ms)#[\da-z]{6}\b
    2. 常用的标志
       re.A或者re.ASCII, 使\b \B \s \S \w \W \d \D都假定字符串为假定字符串为ASCII
      re.I或者re.IGNORECASE 使正则表达式忽略大小写
       re.M或者re.MULTILINE 多行匹配,使每个^在每个回车后,每个$在每个回车前匹配
       re.S或者re.DOTALL 使.能匹配任意字符,包括回车
       re.X或者re.VERBOSE 这样可以在正则表达式跨越多行,也可以添加注释,但是空白需要使用\s或者[ ]来表示,因为默认的空白不再解释。如:
         re.compile(r"""
          <img\s +) #标签的开始
           [^>]*? #不是src的属性
           src= #src属性的开始
           (?:
          (?P<quote>["']) #左引号
           (?P<image_name>[^\1>]+?) #图片名字
           (?P=quote) #右括号
           """,re.VERBOSE|re.IGNORECASE)

2. Python正则表达式模块

  2.1 正则表达式处理字符串主要有四大功能

    1. 匹配 查看一个字符串是否符合正则表达式的语法,一般返回true或者false
    2. 获取 正则表达式来提取字符串中符合要求的文本
     3. 替换 查找字符串中符合正则表达式的文本,并用相应的字符串替换
     4. 分割 使用正则表达式对字符串进行分割。

  2.2 Python中re模块使用正则表达式的两种方法

    1. 使用re.compile(r, f)方法生成正则表达式对象,然后调用正则表达式对象的相应方法。这种做法的好处是生成正则对象之后可以多次使用。
     2. re模块中对正则表达式对象的每个对象方法都有一个对应的模块方法,唯一不同的是传入的第一个参数是正则表达式字符串。此种方法适合于只使用一次的正则表达式。

  2.3 正则表达式对象的常用方法

    1. rx.findall(s,start, end):
      返回一个列表,如果正则表达式中没有分组,则列表中包含的是所有匹配的内容,
       如果正则表达式中有分组,则列表中的每个元素是一个元组,元组中包含子分组中匹配到的内容,但是没有返回整个正则表达式匹配的内容
     2. rx.finditer(s, start, end):
      返回一个可迭代对象
       对可迭代对象进行迭代,每一次返回一个匹配对象,可以调用匹配对象的group()方法查看指定组匹配到的内容,0表示整个正则表达式匹配到的内容
     3. rx.search(s, start, end):
      返回一个匹配对象,倘若没匹配到,就返回None
      search方法只匹配一次就停止,不会继续往后匹配
     4. rx.match(s, start, end):
      如果正则表达式在字符串的起始处匹配,就返回一个匹配对象,否则返回None
    5. rx.sub(x, s, m):
      返回一个字符串。每一个匹配的地方用x进行替换,返回替换后的字符串,如果指定m,则最多替换m次。对于x可以使用/i或者/g<id>id可以是组名或者编号来引用捕获到的内容。
       模块方法re.sub(r, x, s, m)中的x可以使用一个函数。此时我们就可以对捕获到的内容推过这个函数进行处理后再替换匹配到的文本。
     6. rx.subn(x, s, m):
      与re.sub()方法相同,区别在于返回的是二元组,其中一项是结果字符串,一项是做替换的个数。
     7. rx.split(s, m):分割字符串
       返回一个列表
       用正则表达式匹配到的内容对字符串进行分割
       如果正则表达式中存在分组,则把分组匹配到的内容放在列表中每两个分割的中间作为列表的一部分,如:
       rx = re.compile(r"(\d)[a-z]+(\d)")
      s = "ab12dk3klj8jk9jks5"
      result = rx.split(s)
      返回['ab1', '2', '3', 'klj', '8', '9', 'jks5']
    8. rx.flags():正则表达式编译时设置的标志
     9. rx.pattern():正则表达式编译时使用的字符串

  2.4 匹配对象的属性与方法

    01. m.group(g, ...)
      返回编号或者组名匹配到的内容,默认或者0表示整个表达式匹配到的内容,如果指定多个,就返回一个元组
     02. m.groupdict(default)
      返回一个字典。字典的键是所有命名的组的组名,值为命名组捕获到的内容
       如果有default参数,则将其作为那些没有参与匹配的组的默认值。
     03. m.groups(default)
      返回一个元组。包含所有捕获到内容的子分组,从1开始,如果指定了default值,则这个值作为那些没有捕获到内容的组的值
     04. m.lastgroup()
      匹配到内容的编号最高的捕获组的名称,如果没有或者没有使用名称则返回None(不常用)
    05. m.lastindex()
      匹配到内容的编号最高的捕获组的编号,如果没有就返回None。
     06. m.start(g):
      当前匹配对象的子分组是从字符串的那个位置开始匹配的,如果当前组没有参与匹配就返回-1
    07. m.end(g)
      当前匹配对象的子分组是从字符串的那个位置匹配结束的,如果当前组没有参与匹配就返回-1
    08. m.span()
      返回一个二元组,内容分别是m.start(g)和m.end(g)的返回值
     09. m.re()
      产生这一匹配对象的正则表达式
     10. m.string()
      传递给match或者search用于匹配的字符串
     11. m.pos()
      搜索的起始位置。即字符串的开头,或者start指定的位置(不常用)
    12. m.endpos()
      搜索的结束位置。即字符串的末尾位置,或者end指定的位置(不常用)

  2.5 总结

    1. 对于正则表达式的匹配功能,Python没有返回true和false的方法,但可以通过对match或者search方法的返回值是否是None来判断
     2. 对于正则表达式的搜索功能,如果只搜索一次可以使用search或者match方法返回的匹配对象得到,对于搜索多次可以使用finditer方法返回的可迭代对象来迭代访问
     3. 对于正则表达式的替换功能,可以使用正则表达式对象的sub或者subn方法来实现,也可以通过re模块方法sub或者subn来实现,区别在于模块的sub方法的替换文本可以使用一个函数来生成
     4. 对于正则表达式的分割功能,可以使用正则表达式对象的split方法,需要注意如果正则表达式对象有分组的话,分组捕获的内容也会放到返回的列表中

(0)

相关推荐

  • Python基于正则表达式实现检查文件内容的方法【文件检索】

    本文实例讲述了Python基于正则表达式实现检查文件内容的方法分享给大家供大家参考,具体如下: 这个是之前就在学python,欣赏python的小巧但是功能强大,是连电池都自带的语言.平时工作中用Java ,觉得python在日常生活中比java用处要大,首先语法没那么复杂,特别是io的操作,java里要写一大坨没关的代码.还有就是不用编译,而且linux系统默认都会自带. 这次遇到的问题是工作当中想要迁移一个系统中的一个模块,这个时候需要评估模块里的代码有没有对其他代码强依赖,就是有没有imp

  • Python正则表达式非贪婪、多行匹配功能示例

    本文实例讲述了Python正则表达式非贪婪.多行匹配功能.分享给大家供大家参考,具体如下: 一些regular的tips: 1 非贪婪flag >>> re.findall(r"a(\d+?)","a23b") # 非贪婪模式 ['2'] >>> re.findall(r"a(\d+)","a23b") ['23'] 注意比较这种情况: >>> re.findall(r&q

  • python利用正则表达式排除集合中字符的功能示例

    前言 我们在之前学习过通过集合枚举的功能,把所有需要出现的字符列出来,保存在集合里面,这样正则表达式就可以根据集合里的字符是否存在来判断是否匹配成功,如果在集合里,就匹配成功,否则不成功.现在有一个问题,就是要把集合里列出的字符都不能出现才匹配成功,这个需求怎么样实现呢?其实比较简单,只需要在集合前面添加一个字符^,就让正则表达式匹配时,发现有字符在集合里就匹配不成功.下面话不多说了,来一起看看详细的介绍吧. 例子如下: #python 3.6 #蔡军生 #http://blog.csdn.ne

  • python正则表达式re之compile函数解析

    re正则表达式模块还包括一些有用的操作正则表达式的函数.下面主要介绍compile函数. 定义: compile(pattern[,flags] ) 根据包含正则表达式的字符串创建模式对象. 通过python的help函数查看compile含义: help(re.compile) compile(pattern, flags=0) Compile a regular expression pattern, returning a pattern object. 通过help可以看到compile

  • Python基于正则表达式实现文件内容替换的方法

    本文实例讲述了Python基于正则表达式实现文件内容替换的方法.分享给大家供大家参考,具体如下: 最近因为有一个项目需要从普通的服务器移植到SAE,而SAE的thinkphp文件结构和本地测试的有出入,需要把一些html和js的引用路径改成SAE的形式,为了不手工改,特地速成了一下Python的正则表达式和文件操作.主要要求是将某目录下的html和js里面的几个路径变量分别更改成相应的形式,匹配文件名的时候用了正则 import os import re #all file in the dir

  • Python正则表达式知识汇总

    1. 正则表达式语法 1.1 字符与字符类   1 特殊字符:\.^$?+*{}[]()| 以上特殊字符要想使用字面值,必须使用\进行转义   2 字符类      1. 包含在[]中的一个或者多个字符被称为字符类,字符类在匹配时如果没有指定量词则只会匹配其中的一个.   2. 字符类内可以指定范围,比如[a-zA-Z0-9]表示a到z,A到Z,0到9之间的任何一个字符   3. 左方括号后跟随一个^,表示否定一个字符类,比如[^0-9]表示可以匹配一个任意非数字的字符.   4. 字符类内部,

  • Js 正则表达式知识汇总

    正则表达式: 1.什么是RegExp?RegExp是正则表达式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegExp(); 3.RegExp 对象有 3 个方法: 1)test()检索字符串中的指定值,返回值是true或false. 复制代码 代码如下: var p1=new Reg("e"); document.write(Reg.test("welcome to China!")); 2)exec()

  • Python正则表达式分组

    Python正则表达式分组 分组就是用一对圆括号“()”括起来的正则表达式,匹配出的内容就表示一个分组.从正则表达式的左边开始看,看到的第一个左括号“(”表示第一个分组,第二个表示第二个分组,依次类推,需要注意的是,有一个隐含的全局分组(就是0),就是整个正则表达式. 分完组以后,要想获得某个分组的内容,直接使用group(num)和groups()函数去直接提取就行. 例如:提取代码中的超链接中的文本 >>> s='<div><a href="https:/

  • Python对文件操作知识汇总

    打开文件 操作文件 1打开文件时,需要指定文件路径和打开方式 打开方式: r:只读 w:只写 a:追加 "+"表示可以同时读写某个文件 r+:读写 w+:写读 a+:同a U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用) rU r+U "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注) rb wb ab f = open('test.log',

  • Python时间获取及转换知识汇总

    时间处理是我们日常开发中最最常见的需求,例如:获取当前datetime.获取当天date.获取明天/前N天.获取当天开始和结束时间(00:00:00 23:59:59).获取两个datetime的时间差.获取本周/本月/上月最后一天等.而这些转换看起来很乱不容易记住,那么今天我们就来总结一下Python的时间的处理. 原则:以datetime为中心, 起点或中转, 转化为目标对象, 涵盖了大多数业务场景中需要的日期转换处理 步骤: 1. 掌握几种对象及其关系 2. 了解每类对象的基本操作方法 3

  • 学习Python列表的基础知识汇总

    千里之行,始于足下.要练成一双洞悉一切的眼睛,还是得先把基本功扎扎实实地学好.今天,本喵带大家仔细温习一下Python的列表.温故而知新,不亦说乎. 当然,温习的同时也要发散思考,因为有些看似无关紧要的.约定俗成的语言习惯,例如数组索引为何从0开始,其背后可能大有来历.知其然,亦需知其所以然啊喵喵喵~~~ 最后,在基础知识之上,更要探索进阶,例如学习生成器表达式,这样既能更扎实地掌握基础,又能融会贯通,获得更全面的认知升级. Python的列表是怎样滴? 列表(list)是一种有序的集合,可以随

  • Python基础之数据类型知识汇总

    一.数字类型 1.整型int 就是整数 :100 ,200,2,3,4······· 2.浮点型 float 小数:1.22,1.32,1.00······ 3.内置函数--type type(已经被赋值的变量名或变量) count=100 print(type(count)) print(type(1.14)) 二.字符串类型 1.什么是字符串: (1)你在书上看到的都是字符串. (2)字符串用' '或者" "包裹起来 (3)字符串中可以包含任意字符:如字母,数字,符号且没有先后顺序

  • python正则表达式常见的知识点汇总

    目录 一.介绍 二.查找方法的使用 1.match方法(只匹配字符串开头) 2.search方法(扫描整个字符串,找到第一个匹配) 3.re.match与re.search的区别 4.findall方法(扫描整个字符串,找到所有的匹配) 5.finditer方法(扫描整个字符串,找到所有的匹配,并返回一个可迭代对象) 三.re.Match类介绍 四.正则表达式模式 1.非打印字符 2.特殊字符 3.定位符 4.限定符 五.替换 六.贪婪模式和非贪婪模式 七.示例 1.匹配用户名 2.匹配手机号

  • Python正则表达式保姆式教学详细教程

    目录 一.re模块 1.导入re模块 2.findall()的语法: 二.正则表达式 1.普通字符 2.元字符 (二)正则的使用 1.编译正则 2.正则对象的使用方法 3.Match object 的操作方法 4.re模块的函数 正则作为处理字符串的一个实用工具,在Python中经常会用到,比如爬虫爬取数据时常用正则来检索字符串等等.正则表达式已经内嵌在Python中,通过导入re模块就可以使用,作为刚学Python的新手大多数都听说"正则"这个术语. 今天来给大家分享一份关于比较详细

  • 带你精通Python正则表达式

    目录 Python正则表达式 一.re模块 1.导入re模块 2.findall()的语法: 二.正则表达式 1.字符串的匹配 2.正则的使用 Python正则表达式 正则作为处理字符串的一个实用工具,在Python中经常会用到,比如爬虫爬取数据时常用正则来检索字符串等等.正则表达式已经内嵌在Python中,通过导入re模块就可以使用,作为刚学Python的新手大多数都听说"正则"这个术语. 一.re模块 在讲正则表达式之前,我们首先得知道哪里用得到正则表达式.正则表达式是用在find

随机推荐