正则表达式:

它是字符串的一种匹配模式,用来处理字符串,可以极大地减轻处理一些复杂字符串的代码量

字符组:它是在同一位置可能出现的各种字符组成了一个字符组,用[]表示,但是它的结果只能是一个数字或者一个大写字母或小写字母等

下面测试以该网站为例http://tool.chinaz.com/regex/

  1. #正则表达式 匹配字符串  匹配结果
  2. #[0-9] 9 9 [0-9]的写法就相当于在用[0123456789]
  3. #[0123456789] 0 0
  4. #[a-z] 1 None 这里只匹配小写字符a-z而不匹配数字
  5. #[a-z] z z
  6. #[A-Z] A A 这里只匹配大写字符串
  7. #[A-Z0-5a-c] A6b A、b 这里的数字范围只有到0-5所以没匹配到6

元字符:

1.'.' 匹配除换行符以外的任意字符

  1. #正则表达式 匹配字符串 匹配结果
  2. # . a a
  3. # . 1 1
  4. # . & &
  5. # . 换行符 None

2.'\w' 匹配字母或下划线或数字--word

等价于[A-Z0-9a-z_]

  1. #正则表达式 匹配字符串 匹配结果
  2. # \w a a
  3. # \w 1 1
  4. # \w & None
  5. # \w 换行符 None
  6. # \w _ _

3.'\s' 匹配任意的空白符--space

匹配字符串如果什么都不写也会匹配到一个结果,这里的空白符有空格、tab键、回车等空白字符

4.'\d' 匹配任意的数字--digit

等价于[0-9]

  1. #正则表达式 匹配字符串 匹配结果
  2. # \d a None
  3. # \d 1 1
  4. # \d & None

5.'\W' 匹配非字母或数字下划线

和'\w'的结果相反,且空白字符也可以匹配,如果用[\w\W]就相当于全局匹配的效果;等价于[^A-Z0-9a-z_]

6.'\D' 匹配非字符

和'\d'的结果相反,且空白字符也可以匹配;等价于[^0-9]

7.'\S' 匹配非空白字符

和'\s'的结果相反,除了空白字符串其他都匹配

8.'\n' 匹配一个换行符

9.'\t' 匹配一个制表符(tab)

10.'\b' 匹配一个单词的结尾

  1. #正则表达式 匹配字符串 匹配结果
  2. # .\b abx x 匹配一个字符并返回它的末尾字符
  3. # b\b abb b 匹配一个字符串如果它的结尾是b就返回
  4. # b\b aaa None

11.'\f' 匹配一个换页符

12.'\r' 匹配一个回车符

13.'\v' 匹配一个垂直制表符

14.'\B' 匹配一个非单词边界

  1. #正则表达式 匹配字符串 匹配结果
  2. # v\B vers v
  3. # ve\B vers ve
  4. # s\B vers None

15.'\num' 匹配一个正整数

  1. #正则表达式 匹配字符串 匹配结果
  2. # (.)\1 1122 11、22 匹配连续相邻的两个字符

16.'^' 匹配字符串开始

相当于startswith()

  1. #正则表达式 匹配字符串 匹配结果
  2. # ^[A-Z] A456A A

17.'$' 匹配字符串结束

相当于endswith()

  1. #正则表达式 匹配字符串 匹配结果
  2. # [A-Z]$ ASD D

18.'a|b' 匹配字符串a或b

先看左边符不符合条件,若符合则优先匹配左边,否则匹配右边

  1. #正则表达式 匹配字符串 匹配结果
  2. # 123|5 789a12352 123、5
  3. #(ab|c)[0-9] 5ac5ab6 c5、ab6

19.'()' 匹配括号内的表达式也表示一个组

如果要匹配左括号'('就要用'\('语法,右括号')'就要用'\)'

  1. #正则表达式 匹配字符串 匹配结果
  2. # ([a-z]) aswss a、s、w、s、s

20.'[...]' 匹配字符组的字符

21.‘[^...]’匹配除了字符组中字符的所有字符

  1. #正则表达式 匹配字符串 匹配结果
  2. # [^abc] erasdbc e、r、s、d

量词:

用于约束前一个正则匹配的规则,要放在规则的后面

1.'*' 重复零次或多次

0次就是不是正则表示里需要的元素也会算一次

  1. #正则表达式 匹配字符串 匹配次数
  2. # [a]* abaacaaa 6
  3. # [a-z]* abc 2
  4. # []* 1

2.'+' 重复一次或更多次

  1. #正则表达式 匹配字符串     匹配次数
  2. # [a]+ abaacaaa 3
  3. # [a-z]+ abc 1
  4. # []+ 0

3.'?' 重复零次或一次

  1. #正则表达式 匹配字符串     匹配次数
  2. # [a]? abaacaaa    9
  3. # [a-z]? abc 4
  4. # []? 1

4.'{n}' 重复n次

5.'{n,}' 重复n次或更多次

6.'{n,m}' 重复n次到m次

  1. #正则表达式 匹配字符串 匹配次数 匹配结果
  2. # [a]{2,5} aaaaaaaaaaaaa 3 aaaaa、aaaaa、aaa
  3. #[a]{2,5}? aaaaaaaaaaaaa 6 aa、aa、aa、aa、aa、aa        ?放在最后的作用是取最小的次数

用法注意:

1..^$

  1. #正则表达式 匹配字符串 匹配结果
  2. # a. abacadaf ab、ac、ad、af 匹配以a为开头的字符串
  3. # ^a. abacadaf ab 只匹配一个从字符串中以a开头的字符串
  4. # a.$ abacadaf af 只匹配一个从字符串中以a结尾的字符串

2.*+?{ }

  1. #正则表达式 匹配字符串 匹配结果
  2. # 一.? 一二一二三一二三四 一二、一二、一二     匹配一后面的一个任意字符
  3. # 一.* 一二一二三一二三四 一二一二三一二三四     匹配一后面的0或多个任意字符
  4. # 一.+ 一二一二三一二三四 一二一二三一二三四     匹配一后面的1或多个任意字符
  5. # 一.{2,4} 一二一二三一二三四 一二一二三、一二三四    匹配一后面2-4个字符
  6. # 一.{2,4}? 一二一二三一二三四 一二一、一二三     匹配一后面2个字符

*+?的匹配规则都属于贪婪匹配,即尽可能多的匹配,而在规则的最后加?会变成惰性匹配,即尽可能少的匹配

3.字符集[ ][^]

  1. #正则表达式 匹配字符串 匹配结果
  2. # a[bcd]* ab|abc|abcd ab、abc、abcd
  3. # a[^|]* ab|abc|abcd ab、abc、abcd
  4. # [\d] 123a56bc 1、2、3、5、6
  5. # [\d]+ 123a56bc 123、56

4.转义符\

  1. #正则表达式 匹配字符串 匹配结果
  2. # \n \n None
  3. # \\n \n \n 这里的第一个\充当转义的作用
  4. # \\\\n \\n \\n 每需要转义一个\都要在前面写一个\
  5. # r\\\\n r\n r\n 加r会让整个结果不转义

5.非贪婪匹配

  1. #正则表达式 匹配字符串 匹配结果
  2. # a[a-z]*? aaaaaaa a、a、a、a、a、a、a(7次)
  3. # a[a-z]+? aaaaaaa aa、aa、aa(3次)
  4. # a[a-z]?? aaaaaaa a、a、a、a、a、a、a(7次)
  5. #a[a-z]{2,4}? aaaaaaa aaa、aaa(2次)
  6. #a[a-z]{2,}? aaaaaaa aaa、aaa(2次)

'.*?x’的作用是直到找到x就停止

  1. #正则表达式 匹配字符串 匹配结果
  2. # .*?a 45bjswakaabaa 45bjswa、ka、a、ba、a

6.身份证号是一个长度为15或18的字符串,如果是15位则全部是数字组成,首位不能为0,如果18位,则前17位全是数字,末尾可能是x或数字

  1. # 正则表达式 匹配字符串 匹配结果
  2. #^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ 122345688989788 122345688989788
  3. #^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ 12234568898978811x 12234568898978811x

re模块:

常用方法:

1.findall()

返回所有满足匹配条件的结果并放在一个列表中

  1. import re
  2. ret = re.findall('[a-z0-9]','aAbBcC123&')
  3. print(ret)                     #['a', 'b', 'c', '1', '2', '3']

优先级:

这里的问号具有取消分组优先级的作用

  1. import re
  2. ret = re.findall('www.(baidu|google).com', 'www.google.com')
  3. print(ret) #['google']
  4. ret = re.findall('www.(?:baidu|google).com', 'www.google.com')
  5. print(ret) #['www.google.com']

2.search()

在字符串中从左到右找到一个符合匹配标准的就返回一个对象,如果ret没有匹配到就返回None

  1. import re
  2. ret = re.search('[a]+','12aaa78a8aa')
  3. print(ret) #<re.Match object; span=(2, 5), match='aaa'>
  4. print(ret.group()) #aaa
  5. ret2 = re.search('[A-Z]+','12aaa78a8aa')
  6. print(ret2) #None
  7. print(ret2.group()) #AttributeError: 'NoneType' object has no attribute 'group'

增加一个判断,如果有匹配成功就返回匹配的字符串,没成功就不执行

  1. import re
  2. ret = re.search('[a]+','12aaa78a8aa')
  3. if ret:
  4. print(ret.group()) #aaa

注意:

  1. import re
  2. ret = re.search('^[0-9](\d{5})(\d{2})?$','')
  3. print(ret.group()) #
  4. print(ret.group(1)) #15345    拿到每一个分组的数值
  5. print(ret.group(2)) #

3.match()

这个方法就是从开头开始匹配,如果正则规则能够匹配的上开头,那么就返回一个对象,结果中的内容要group()方法才能显示,如果没有匹配上就返回None,调用group()就会报错

  1. import re
  2. ret = re.match('[0-9a-z]+','abc123A33a')
  3. print(ret) #<re.Match object; span=(0, 6), match='abc123'>
  4. if ret:
  5. print(ret.group()) #abc123

4.split()

先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割得到''和'cd',分割完的字符会消失

  1. import re
  2. ret = re.split('[ab]','abcd')
  3. print(ret) #['', '', 'cd']

优先级:

  1. import re
  2. ret1 = re.split('\d+','abc1abcsw22asww3312a')
  3. print(ret1) #['abc', 'abcsw', 'asww', 'a']
  4. ret2 = re.split('(\d+)','abc1abcsw22asww3312a')
  5. print(ret2) #['abc', '1', 'abcsw', '22', 'asww', '3312', 'a'] 加上了括号之后能够保留匹配项,没加括号则不保留匹配项

5.sub()

将正则规则匹配到的英文小写字母替换成'&',后面的5表示只替换5次

  1. import re
  2. ret = re.sub('[a-z]','&','eva3sdww4asd22H3',5)
  3. print(ret)     #&&&3&&ww4asd22H3

6.subn()

和sub执行效果几乎相同,结果会返回替换后的字符串和替换次数

  1. import re
  2. ret = re.subn('[a-z]','&','eva3sdww4asd22H3',5)
  3. print(ret) #('&&&3&&ww4asd22H3', 5)

7.compile()

当一个正则规则需要被反复的调用且它的正则表达式很长,它就需要用到compile()

  1. import re
  2. obj = re.compile('\d{3,5}') #将正则表达式编译成一个正则表达式对象,规则要匹配3-5个数字
  3. ret = obj.search('abc12gha12432j1222')
  4. print(ret.group()) #
  5. ret = obj.search('easda22132aasdw22sdaw')
  6. print(ret.group()) #

8.finditer()

结果可以返回一个存放结果的迭代器

  1. import re
  2. ret = re.finditer('[a-z]{2,3}','12abs23saw7a8sddw')
  3. print(ret)            #<callable_iterator object at 0x00000000027A2160>
  4. print([i.group() for i in ret]) #['abs', 'saw', 'sdd']

9.分组命名

  1. import re
  2. ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>page</h1>")   #在分组中利用?<name>的形式给分组取名字
  3. print(ret.group('tag_name')) #h1    
  4. print(ret.group()) #<h1>page</h1>
  1. import re
  2. ret = re.search(r"<(\w+)>\w+</\1>","<h1>page</h1>")                #在分组中不想写名字的话可以用\序号来找到对应的组,表示要找的内容和前面组内容一致
  3. print(ret.group(1)) #h1
  4. print(ret.group()) #<h1>page</h1>

10.flags参数

  1. re.I(IGNORECASE):忽略大小写,括号内是完整的写法
  2. re.M(MULTILINE):多行模式,改变^和$的行为
  3. re.S(DOTALL):点可以匹配任意字符,包括换行符
  4. re.L(LOCALE):做本地化识别的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,不推荐使用
  5. re.U(UNICODE):使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag
  6. re.X(VERBOSE):冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释

Python学习日记(十四) 正则表达式和re模块的更多相关文章

  1. Python学习(十四) —— 并发编程

    一.进程的概念 进程即正在执行的一个过程,进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念.操作系统的其它所有内容都是围绕进程的概念展开的. #必备的理论基础 #一 ...

  2. python学习笔记(十 四)、web.py

    使用web.py 通过python进行网页的编写,下面我们来简单了解一哈web.py 的使用 1 url处理 使用特定的url结构来解析我们发送的请求.如下面所示: urls = ( '/login' ...

  3. Python 学习 第十四篇:命名元组

    Python的元组不能为元组内部的数据进行命名,而 collections.namedtuple 可以来构造一个含有字段名称的元组类,命名元组可以通过逗号+字段名来获取元素值: collections ...

  4. Python学习日记(十八) 序列化模块

    什么是序列? 就是每一个元素被有序的排成一列 什么是序列化? 就是将原本的列表.字典等内容转化成字符串的过程 什么时候会用到序列化? 数据存储(把数据放在文件.数据库),网络传输等 序列化的目的 1. ...

  5. Python学习日记(十六) time模块和random模块

    time模块 python表示时间的三种方式:时间戳.元祖(struct_time).格式化时间字符串 三种格式之间的转换: 1.时间戳 就是从1970年1月1日0点0分0秒开始按秒计算的偏移量,时间 ...

  6. python 学习笔记十四 jQuery案例详解(进阶篇)

    1.选择器和筛选器 案例1 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  7. python学习第十四天 -面向对象编程基础

    python也是支持面向对象编程的.这一章节主要讲一些python面向对象编程的一些基础. 什么是面向对象的编程? 1.面向对象编程是一种程序设计范式 2.把程序看做不同对象的相互调用 3.对现实世界 ...

  8. Python学习第十四篇——类初步使用及面向对象思想

    class Restaurant(): def __init__(self,restaurant_name,cuisine_type): self.name = restaurant_name sel ...

  9. python学习笔记十四:wxPython Demo

    一.简介 wxPython是Python语言的一套优秀的GUI图形库,允许Python程序员很方便的创建完整的.功能键全的GUI用户界面. wxPython是作为优秀的跨平台GUI库wxWidgets ...

随机推荐

  1. Mxnet:以全连接层为例子自定义新的操作(层)

    https://blog.csdn.net/a350203223/article/details/77449630 在使用深度学习平台时,光会使用其中已定义好的操作有时候是满足不了实际使用的,一般需要 ...

  2. 泡泡一分钟:GEN-SLAM - Generative Modeling for Monocular Simultaneous Localization and Mapping

    张宁  GEN-SLAM - Generative Modeling for Monocular Simultaneous Localization and Mapping GEN-SLAM  - 单 ...

  3. [译]为什么在__new __()后总是调用__init __()?

    原文来源: https://stackoverflow.com/questions/674304/why-is-init-always-called-after-new 需要控制新实例的创建时,请使用 ...

  4. codeMirror配置

    介绍 CodeMirror是一款在线的支持语法高亮的代码编辑器.官网:http://codemirror.net/ 下载后,解压开到的文件夹中,lib下是放的是核心库和核心css,模式下放的是各种支持 ...

  5. 学习记录-java基础部分(一)

    学习记录-java基础部分(一) 参考:GitHub上的知名项目:javaGuide : https://github.com/Snailclimb/JavaGuide/blob/master/doc ...

  6. dubbo源码分析01:SPI机制

    一.什么是SPI SPI全称为Service Provider Interface,是一种服务发现机制,其本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件.这样可以在运行时,动态为 ...

  7. (一)Python的特点(优点和缺点)

    Python 是一种面向对象.解释型的脚本语言,同时也是一种功能强大而完善的通用型语言.相比其他编程语言(比如 Java),Python 代码非常简单,上手非常容易. Python优点: (1)简单易 ...

  8. javascript遍历对象的属性

    不同类型的循环 JavaScript 支持不同类型的循环: for - 多次遍历代码块 for/in - 遍历对象属性 while - 当指定条件为 true 时循环一段代码块 do/while - ...

  9. A+B 和 C

    给定区间 [−] 内的 3 个整数 A.B 和 C,请判断 A+B 是否大于 C. 输入格式: 输入第 1 行给出正整数 T (≤),是测试用例的个数.随后给出 T 组测试用例,每组占一行,顺序给出  ...

  10. Windows下mysql安装配置问题

    下载最新版的mysql: https://dev.mysql.com/downloads/mysql/ 下载完成后解压打开安装包如下 打开cmd以管理员身份运行(一定要以管理员身份运行) 然后输入命令 ...