前言:
       普通人有三件东西看不懂:医生的处方,道士的鬼符,程序员得正则表达式
 
    什么是正则表达式?
  • 正则表达式,又称规则表达式,英文名为Regular Expression,在代码中常简写为regex、regexp或RE,
  • 是计算机科学的一个概念。
  • 许多程序设计语言都支持利用正则表达式进行字符串操作。
  • 例如,在Python中就内建了一个功能强大的正则表达式接口擎。
  • 正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。
  • 正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
  • 正则就是用有限的符号,处理表达无限的序列
    有什么作用?
  • 正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
  • 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))
  • 操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,
  • 组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
  • 正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串。
 
 
 
正则表达式语法:
 
 
 
 
 
 
正则表达式:
 
    动机:
        1. 文本处理已经成为计算机常见工作之一
        2. 对文本的搜索,定位,提取的逻辑往往比较复杂
        3. 为了解决上述问题,产生正则表达式技术
 
    定义 : 
        正则表达式即文本的高级匹配模式,提供搜索,替代,获取等功能。
        本质是由一系列特属符号和字符 构成的字串,这个字串就是正则表达式。
 
    特点 
        * 方便进行检索和修改等文本操作
        * 支持语言众多
        * 灵活多样
 
 
正则表达式匹配手段:
 
    通过设定有特殊意义的符号,描述符号和字符的
    重复行为及位置特征来表示一类特定规则的字符串
    python ---> re模块  处理正则表达式
 
    re.findall(pattern,string)
    参数:
        pattern : 
            以字符串形式传入一个正则表达式
        string : 
            要匹配的目标字符串
        返回值 : 得到列表,将目标字串中能用正则匹配的内容放入列表
 
正则表达式元字符:
    1. 普通字符匹配 :
 
        (除了后续讲解的特殊字符全是普通字符)
        可以用普通字符来匹配对应的字符
            In [11]: re.findall("abc",'abcdefghabi')
            Out[11]: ['abc']
 
            In [12]: re.findall("成都",'成都的街头走一走')
            Out[12]: ['成都']
 
    2.  或:
        元字符:  |
 
        匹配规则: 匹配符号两侧的正则表达式均可
            In [14]: re.findall("ab|cd",'abcdefghabi')
            Out[14]: ['ab', 'cd', 'ab']
 
    3. 匹配单个字符:
        元字符: .
 
        匹配规则: 匹配除 \n 外任意一个字符
        f.o  ---> foo  fao  f@o
            In [18]: re.findall("w.o",'woo,wao is not wbo')
            Out[18]: ['woo', 'wao', 'wbo']
 
    4. 匹配开始位置:
        元字符:  ^
 
        匹配规则: 匹配目标字符串的开头位置
            In [20]: re.findall("^Jame","Jame,how are you")
            Out[20]: ['Jame']
 
    5. 匹配结束位置:
        元字符 : $
 
        匹配规则: 匹配目标字符串的结束位置
            In [23]: re.findall("py$","hello.py")
            Out[23]: ['py']
 
    6. 匹配重复:
        元字符 : *
 
        匹配规则: 匹配前面出现的正则表达式0次或多次
        fo*  ---->  f  fo  fooooooooooooooooooo
            In [31]: re.findall("ab*","abcdefae&65abbbbbbbb")
            Out[31]: ['ab', 'a', 'abbbbbbbb']
 
    7. 匹配重复:
        元字符 :  +
 
        匹配规则: 匹配前面出现的正则表达式1次或多次
        ab+  ---》 ab  abbbbb
            In [33]: re.findall(".+py$","hello.py")
            Out[33]: ['hello.py']
 
    8. 匹配重复:
        元字符 : ?
 
        匹配规则: 匹配前面出现的正则表达式0次或1次
        ab?  --->  a   ab
            In [36]: re.findall("ab?","abcea,adsfabbbbbb")
            Out[36]: ['ab', 'a', 'a', 'ab']
 
    9. 匹配重复:
        元字符: {n}
 
        匹配规则: 匹配前面的正则出现n次
        ab{3} ---> abbb
            In [39]: re.findall("ab{3}","abcea,adsfabbbbbb")
            Out[39]: ['abbb']
 
    10. 匹配重复:
        元字符 :  {m,n}
 
        匹配规则 : 匹配前面的正则m-n次
        ab{3,5} ---> abbb  abbbb  abbbbb
            In [45]: re.findall("ab{3,5}","ab abbb abbbbabbbbbb")
            Out[45]: ['abbb', 'abbbb', 'abbbbb']
 
    11. 匹配字符集合:
        元字符: [字符集]
        匹配规则: 匹配字符集中任意一个字符
        [abc123] -->  a  b  c 1 2 3  
            In [46]: re.findall("[aeiou]","hello world")
            Out[46]: ['e', 'o', 'o']
 
            [0-9]  [a-z]  [A-Z]  [0-9a-z]
 
            In [47]: re.findall("^[A-Z][a-z]*","Hello world")
            Out[47]: ['Hello']
 
            [_abc0-9]
 
    12.  匹配字符集:
        元字符:  [^...]
 
        匹配规则:匹配除了中括号中字符集字符之外的任意一个字符
            In [50]: re.findall("[^0-9]+","hello1")
            Out[50]: ['hello']
 
    13. 匹配任意(非)数字字符:
        元字符 : \d   \D
 
        匹配规则: \d 匹配任意一个数字字符     [0-9]
                   \D 匹配任意一个非数字字符   [^0-9]
            In [52]: re.findall("1\d{10}","13717776561")
            Out[52]: ['13717776561']
 
            In [53]: re.findall("\D+","hello world")
            Out[53]: ['hello world']
 
    14. 匹配任意(非)普通字符 :
        (数字字母下划线 普通utf-8字符)
          元字符 : \w   \W
 
        匹配规则: \w  匹配一个普通字符
                   \W  匹配一个非普通字符
            In [54]: re.findall("\w+","hello$1")
            Out[54]: ['hello', '1']
 
            In [55]: re.findall("\W+","hello$1")
            Out[55]: ['$']
 
 
    15.  匹配(非)空字符:
        (空格, \r  \n  \t  \v  \f)
        元字符:  \s   \S
 
        匹配规则:  \s  匹配任意空字符
                   \S  匹配任意非空字符
            In [59]: re.findall("\w+\s+\w+","hello   world")
            Out[59]: ['hello   world']
 
            In [61]: re.findall("\S+","hello world")
            Out[61]: ['hello', 'world']
 
    16.  匹配起止位置:
          元字符:  \A   \Z
 
        匹配规则:  \A  匹配字符串开头位置   ^
                    \Z  匹配字符串结尾位置   $
            In [63]: re.findall("\Ahi","hi,Tom")
            Out[63]: ['hi']
            In [2]: re.findall("is\Z",'This')
            Out[2]: ['is']
        完全匹配 : 使用一个正则表达式可以匹配目标字符串的全部内容
            In [6]: re.findall("\A\w{5}\d{3}\Z",'abcde123')
            Out[6]: ['abcde123']
 
    17.  匹配(非)单词边界:
        (普通字符和非普通字符的交接位置认为是单词边界)
        元字符 : \b  \B
 
        匹配规则 :  \b  匹配单词边界位置
                     \B  匹配非单词边界位置
            In [17]: re.findall(r"\bis\b",'This is a test')
            Out[17]: ['is']
 
元字符总结:
    匹配单个字符 :
            a  .  [...]  [^...]  \d  \D   \w  \W \s  \S
    匹配重复:
             *   +   ?  {n}  {m,n}
 
    匹配位置: 
            ^  $  \A   \Z   \b  \B
 
    其他 : 
            |   ()  \
 
 
正则表达式的转义:
    正则表达式特殊字符:
        .  *   ?  $  ^  []  {}   ()  \
        在正则表达式中如果想匹配这些特殊字符需要进行转义
            In [23]: re.findall("\[\d+\]",'abc[123]')
            Out[23]: ['[123]']
 
    raw 字符串 ---》 原始字符串
        特点 : 对字符串中的内容不进行转义,即表达原始含义
            让转义符无效
                r"\b"   ---> \b
                "\\b"   ---> \b
             
            In [39]: re.findall("\\w+@\\w+\\.cn",'lvze@tedu.cn')
            Out[39]: ['lvze@tedu.cn']
 
            In [40]: re.findall(r"\w+@\w+\.cn",'lvze@tedu.cn')
            Out[40]: ['lvze@tedu.cn']
 
 
贪婪和非贪婪:
    贪婪模式 : 
        正则表达式的重复匹配,总是尽可能多的向后匹配内容。
            *  +   ?  {m,n}
 
    贪婪 ---》 非贪婪(懒惰) 尽可能少的匹配内容
        *?   +?   ??   {m,n}?
 
        In [46]: re.findall(r"ab*?",'abbbbbbbbbb')
        Out[46]: ['a']
 
        In [47]: re.findall(r"ab+?",'abbbbbbbbbb')
        Out[47]: ['ab']
 
 
正则表达式分组:
    使用()可以为正则表达式建立子组,子组不会影响正则
    表达式整体的匹配内容,可以被看做是一个内部单元。
 
    子组的作用:
        1. 形成内部整体,该表某些元字符的行为
            In [52]: re.search(r"(ab)+",'abababab').group()
            Out[52]: 'abababab'
 
            re.search(r"\w+@\w+\.(com|cn)",'Python@tedu.cn').group()
 
        2. 子组匹配内容可以被单独获取
            re.search(r"\w+@\w+\.(com|cn)",'lvze@tedu.com').group(1)
            Out[59]: 'com'
 
    子组注意事项:
        * 一个正则表达式中可以有多个子组,区分第一,第二。。。子组
        * 子组不要出现重叠的情况,尽量简单
 
    捕获组和非捕获组 (命令组,未命名组)
        捕获格式 :(?P<name>pattern)
            re.search(r"(?P<dog>ab)+",'abababab').group()
 
        作用 : 
            1 方便通过名字区分每个子组
            2  捕获组可以重复调用
    调用格式:(?P=name)
            P<dog>ab)cd(?P=dog) ===>   abcdab
                In [69]: re.search(r"(?P<dog>ab)cdef(?P=dog)",'abcdefab').group()
                Out[69]: 'abcdefab'
 
正则表达式的匹配原则:
    1. 正确性  能够正确匹配目标字符串
    2. 唯一性  除了匹配的目标内容,尽可能不会有不需要的            内容
    3. 全面性  对目标字符串可能的情况要考虑全面不漏
 
 
re模块的使用:
    regex = re.compile(pattern,flags = 0)
        功能 : 
            生成正则表达式对象
        参数 : 
            pattern     正则表达式
            flags  功能标志位,丰富正则表达式的匹配
        返回值: 
            返回一个正则表达式对象
 
    re.findall(pattern,string,flags = 0)
        功能 : 
            根据正则表达式匹配目标字串内容
        参数 : 
            pattern     正则表达式
            string       目标字符串
        返回值: 
            列表 里面是匹配到的内容
            如果正则表达式有子组,则只返回子组中的内容
 
    regex.findall(string,pos,endpos)
        功能 : 
            根据正则表达式匹配目标字串内容
        参数 :  
            string       目标字符串
            pos,endpos : 截取目标字符串的起止位置进行匹              配,默认是整个字符串
        返回值: 
            列表 里面是匹配到的内容
            如果正则表达式有子组,则只返回子组中的内容
 
    re.split(pattern,string,flags = 0)
        功能 : 
            通过正则表达式切割目标字符串
        参数 : 
            pattern     正则
            string       目标字串
        返回值 : 
            以列表形式返回切割后的内容
 
    re.sub(pattern,replace,string,max,flags)
        功能: 
            替换正则表达式匹配内容
        参数: 
            pattern     正则
            replace     要替换的内容
            string       目标字符串
            max          设定最多替换几处
        返回值 : 
            替换后的字符串
 
    re.subn(pattern,replace,string,max,flags)
        功能和参数同sub
        返回值多一个实际替换了几处
 
    re.finditer(pattern,string,flags)
        功能: 
            使用正则匹配目标字串
        参数:  
            pattern     正则
            string       目标字串
        返回值: 
            迭代对象 ----》 迭代内容为match对象
 
    re.fullmatch(pattern,string,flags)
        功能 : 
            完全匹配一个字符串
        参数:  
            pattern     正则
            string        目标字串
        返回值:
            match对象,匹配到的内容
 
    re.match(pattern,string,flags)
        功能 : 
            匹配一个字符串起始内容
        参数:  
            pattern     正则
            string        目标字串
        返回值:
            match对象,匹配到的内容
 
    re.search(pattern,string,flags)
        功能 : 
            匹配第一个符合条件的字符串
        参数:  
            pattern              正则
            string                目标字串
        返回值:
            match对象 匹配到的内容
 
 
    regex 对象的属性
        flags                 标志位数值
        pattern             正则表达式
        groups             子组个数
        groupindex      获取捕获组字典,键为组名值是第几组

Python全栈 正则表达式(概念、、语法、元字符、re模块)的更多相关文章

  1. Python全栈工程师(装饰器、模块)

    ParisGabriel                每天坚持手写  一天一篇  决定坚持几年 全栈工程师     Python人工智能从入门到精通 装饰器 decorators(专业提高篇) 装饰 ...

  2. python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)

    一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...

  3. Python全栈 正则表达式(re模块正则接口全方位详解)

    re模块是Python的标准库模块 模块正则接口的整体模式 re.compile 返回regetx对象 finditer fullmatch match search 返回 match对象 match ...

  4. python 全栈开发,Day28(复习,os模块,导入模块import和from)

    一.复习 collections 增加了一些扩展数据类型 :namedtuple orderdict defaltdict队列和栈time 时间 三种格式 : 时间戳 结构化 字符串random 随机 ...

  5. python全栈开发_day15_函数回调和模块

    一:函数回调 def a(fn=None): print("run1") if fn: fn() print("run 2") def b(): print(& ...

  6. 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】

    点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...

  7. python全栈开发学习_内容目录及链接

    python全栈开发学习_day1_计算机五大组成部分及操作系统 python全栈开发学习_day2_语言种类及变量 python全栈开发_day3_数据类型,输入输出及运算符 python全栈开发_ ...

  8. python全栈开发之正则表达式和python的re模块

    正则表达式和python的re模块 python全栈开发,正则表达式,re模块 一 正则表达式 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的 ...

  9. python全栈开发中级班全程笔记(第二模块、第四章(三、re 正则表达式))

    python全栈开发笔记第二模块   第四章 :常用模块(第三部分) 一.正则表达式的作用与方法 正则表达式是什么呢?一个问题带来正则表达式的重要性和作用      有一个需求 : 从文件中读取所有联 ...

随机推荐

  1. maven学习记录一——maven介绍及入门

    1       Maven的简介 1.1     什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的 1.2     Maven好处 普通的传统项目 M ...

  2. 关于eclipse中引入项目报错或者没有JRE System Library问题(jre报错)或者jre1.7(8)改为jre1.8(7)等问题

    解决方法: 右键项目工程-->>properties->>java bulid path -->>>libraries -->>add libra ...

  3. 整理 45 道 CSS 基础面试题(附答案)

    1.介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin低版本IE盒子模型:宽度 ...

  4. $CRS_HOME/cdata下大量数字命名的文件,占用空间大

    问题现象:    <CRS_HOME>/cdata目录下存在大量数字命名的文件,导致文件系统爆满 $ls -alrth /opt/oracle/product/CRS/cdata/crs ...

  5. 选择客栈(noip2011 day1 t2)

    题目描述 丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 nn n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k−1 表示),且每家客栈都设有一家咖啡店,每 ...

  6. BZOj1261: [SCOI2006]zh_tree(dp)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 400  Solved: 272[Submit][Status][Discuss] Descriptio ...

  7. 一次Redis 的性能测试和问题 [问题已经自己解决,见文章最后]

    [我的问题]:请教个问题,我在本机搭建linux虚拟机+redis 3.2.6,然后在本机物理机上面测试虚拟机的redis性能,如下VM配置参数做测试,redis 的性能好像不算太好,问题待排查的两点 ...

  8. Struts2拦截器说明

    有关于Struts2的拦截器的原理 在此共设置了两个拦截器,firstInterception.SecondInterception package struts2_inteception; publ ...

  9. ECSHOP和SHOPEX快递单号查询德邦插件V8.6专版

    发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...

  10. 2.1 进程控制之fork创建子进程

    fork()函数 目标:熟悉fork创建一个和多个子进程子线程 函数原型:pid_t fork(void); 返回值:成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0 : 失败返回-1. ...