正则表达式理论及 re模块解

动机:
  1 文本处理已经成为计算机常见工作之一
  2 对文本内容的搜索,定位,提取是逻辑比较复杂的工作
  3 为快速解决上述问题,产生了正则表达式技术

定义:即文本的高级匹配模式,提供搜索,替代等功能
  其本质是一系列由特殊符号组成的字串,这个字串即正则表达式。

匹配原理: 由普通字符和特殊符号组成字符串,通过描述字符的重复和位置等行为达到匹配某一类字符串的目的

目标 :
  1 熟练掌握正则表达式符号
  2 实现基本的文本搜索,定位,提取,理解正则用法
  3 能够使用RE模块操作正则表达式

特点:
  * 方便文本处理
  * 支持语言众多
  * 使用灵活多样

元字符
  1 普通字符匹配
  2 或
    元字符: 【|】
    匹配规则,匹配符号两侧的正则表达式均可
  3 匹配单个字符
    元字符 :【.】
    匹配规则:匹配除换行外的任意字符
  4 匹配开始位置
    元字符:【^】
    匹配规则:匹配目标字符串的开头位置
      不在开头,则返回为空
  5 匹配结束位置
    元字符:【$】
    匹配规则:匹配字符串的结束位置
  6 匹配重复:【*】
    匹配规则:匹配前面的字符出现0次或多次
    如果匹配f*,,就会出现多个空字符,正则表达式问题
  7 匹配重复
    元字符:【+】
    匹配规则:匹配前面的字符出现1次或多次
  8 匹配重复
    元字符:【?】
    匹配规则:匹配前面的字符出现0次或一次
  9 匹配重复
    元字符:{n}  
     匹配规则:匹配指定的重复次数
    fo{3}  --> fooo 匹配 o 3次
  10 匹配重复
    元字符:{m,n}
    匹配规则:匹配前面的正则表达式 m -- n
    fo{2,4} --> foo fooo foooo
  11 匹配单个字符
    元字符:【[字符集]】
    匹配规则:匹配任意一个字符集中的字符
    【[abc123]】  a b c 1 2 3
    【[_123a-z]】
  12 匹配字符集
    元字符:【[^...]】
    匹配规则:字符集取非,除列出的字符之外任意一个字符
    【[^abc]】-->除a b c 之外的任意字符
  
s1 = 'Boy ama is this'
a = re.findall('[^ ]+',s1)
print(a)

/usr/bin/python3.5 /home/tarena/PycharmProjects/untitled/day9_25/text.py
['Boy', 'ama', 'is', 'this']

Process finished with exit code 0

  13 匹配任意(非)数字字符
    元字符:\d  \D  
    匹配规则: \d 匹配任意数字字符  
          \D 匹配任意非数字字符
  14 匹配任意(非)普通字符
    元字符:\w [_0-9a-zA-Z]也能匹配普通汉字
        \W 非普通字符(shift+第二排键盘基本都属于)
  15 匹配任意(非空字符)
    元字符: \s  匹配任意空字符 [ \r\t\n\v\f]
        \S   匹配任意非空字符
  16 匹配字符串位置 
    元字符:
        \A 匹配字符串开头位置 ^
        \Z 匹配字符串结尾位置 $
    
s1 = 'Boy ama is this'
a = re.findall('\AB',s1)
print(a)
a = re.findall('s\Z',s1)
print(a)

  17 匹配(非)单词边界
              普通字符和非普通字符交界是单词边界
    元字符: \b 匹配单词边界位置  
         \B 匹配非单词边界位置
  

绝对匹配:正则表达式要完全匹配目标字符串内容

  在正则表达式开始和结束位置加^$(或者\A \Z).这样正则表达式必须匹配整个目标字符串才会有结果

匹配单个字符: a  . \d \D \w \W \s \S [...] [^...]

匹配重复: * + ? {n} {m,n}

匹配位置: ^  $ \A \Z \b \B

其他: | () \

 

正则中的特殊符号 : 。 * + ? ^ $ [] () | \

正则表达式转义:

  正则表达式如果匹配特殊字符需要加 \ 表达转义

  raw字串:原始字串对内容不解释转义,就表达内容原本意义


贪婪与非贪婪
贪婪模式:正则表达式的重复匹配总是尽可能多的向后匹配更多内容
  * + ? {m,n}
非贪婪模式(懒惰模式):尽可能少的匹配内容
贪婪---》非贪婪 *? +? ?? {m,n}?

正则表达式的子组
  可以使用()为正则表达式建立子组,子组可以看做是正则表达式内部操作的一个整体
  * 子组是在正则表达式整体匹配到内容的前提下才会发挥作用,它不影响正则表达式整体去匹配目标内容这一原则


    

re.match 函数

  原型:match(pattern,string,flags=0)
    patter:匹配的正则表达式
    string:要匹配的字符串
    flags:标志位,用于控制正则表达式的匹配方式
    *  re.I 忽略大小写
       re.L 做本地户识别
    *  re.M 多行匹配,影响 ^ 和 $
    *  re.S 是.匹配包括换行符在内的所有字符
       re.U 根据Unicode字符集解析字符,影响 \w \W \b \B
       re.X 使我们以更灵活的格式理解正则表达式

  参数:
  功能:尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回NONE
  返回的对象,使用 .span()来获取位置


正则表达式设计原则
  1 正确性,能正确匹配到目标内容
  2 排他性,除了要匹配的内容,尽可能不会匹配到其他内容
  3 全面性,需要对目标的各种情况进行考虑,做到不遗漏

regex = compile(pattern,flags = 0)
  功能:生成正则表达式对象
  参数: pattern 正则表达式
      flags 功能标志位,丰富正则表达式的匹配功能
  返回值:返回正则表达式对象

re.serch 函数
  原型:
search(pattern, string, flags=0)
  参数:
    patter:匹配的正则表达式
    string:要匹配的字符串
    flags:标志位,用于控制正则表达式的匹配方式
  功能: 扫描整个字符串,并返回第一个成功的匹配对象信息,
s3 = 'ababab133444433332adfs'
a = re.search(r'(ab)+\d+',s3).group()

s3 = '10@qq.cn'
a = re.search(r'\w+@\w+.(com|cn)',s3).group()
子组所用
  1 作为内部整体可以改变某些元字符的行为
子组使用注意事项
  * 一个正则表达式中可以有多个子组
  * 子组一般由外到内,由左到右称之为第一,第二,第三...子组
  * 子组不能重叠,嵌套也不宜很多
捕获组 和 非捕获组
格式:(?P<name>pattern)
作用:可以通过组名更方便获取某组内容
s3 = '10@qq.cn'
a = re.search(r'(?P<year>[\u4e00-\u9fa5]+)',s).group('year')

 


re.findall 函数
  原型:findall(r'pattern', string, flags=0)
  参数:
    patter:匹配的正则表达式
    string:要匹配的字符串
    flags:标志位,用于控制正则表达式的匹配方式
  功能: 扫描整个字符串,并返回匹配到的结果列表
  返回值:返回匹配到的内容
      如果正则有子组则只返回子组对应内容

regex.findall(string,pos,endpos)
  功能:从目标字符串查找正则匹配内容
  参数:string 目标字符串
     pos  匹配目标的起始位置
     endpost 匹配目标的终止位置
  返回值:返回匹配到的内容
      如果正则有子组则只返回子组对应内容
regex对象的方式和直接调用re.findall的方式多了一个文本处理的起始位置和终止位置,这里需要注意

re.split(pattern,string,flags = 0)
  功能:根据正则匹配内容切割字符串
  参数:pattern string flags
  返回值:返回列表,列表中为切割的内容
pattern = r'\s+'
s = 'hello word liu jie'
a = re.split(pattern,s)
print(a)
View Code--split
  

re.sub(pattern,replaceStr,string,max,flags)
  功能:替换正则匹配到的目标子串部分
  参数 : pattern
      replaceStr  要替换的内容
      string
      max  最多要替换几处 默认全部替换
      flags
  返回值:返回替换后的字符串
  
import re
pattern = r'\s+'
s = 'hello word liu jie'
a = re.sub(pattern,'##',s)
print(a)
View Code--sub

re.subn(pattern,replaceStr,string,max,flags)
  功能:替换正则匹配到的目标子串部分
  参数 : pattern
      replaceStr  要替换的内容
      string
      max  最多要替换几处 默认全部替换
      flags
  返回值:返回一个元组, 为实际替换了几处和替换后的字符串
      与re.sub相差无异,多了一个替换了几处的返回值

re.finditer(pattern,string,flags)
  功能:使用正则表达式匹配目标字符串
  参数:pattern string  flags
  返回值:返回一个迭代对象,迭代到的内容是一个match对象
  
re.fullmatch(pattern,string,flags)
  功能:完全匹配目标字符串
  参数:pattern,string,flags
  返回值:返回匹配到的match对象,如果没匹配成功返回None
obj = re.fullmatch(r'\w+','abcderfd')
print(obj.group())
View Code--fullmatch
match(pattern,string,flags)
  功能:从开头位置匹配目标字符串 类似于[^]
  参数:pattern,string,flags
  返回值:返回匹配到的match对象,如果没匹配成功返回None
obj = re.match(r'foo','Foo,food on the table',re.I)
print(obj.group())
View Code--match

compile 对象属性:
  flags:标志位
  pattern:正则表达式
  group: 有多少子组
  groupindex: 捕获组形成组名和序列号的字典,组名为键,第几组为值
regex = re.compile(r'(?P<dog>ab)cd(ef)',flags=re.I)
print(regex.groupindex)
View Code--compile_groupindex

 

match函数
  属性变量
    pos #匹配目标字符串的开始位置
    endpos #匹配目标字符串的结束位置
    re #正则表达式
    string #目标字符串
    lastgroup #最后一组的组名
    lastindex #最后一组是第几组
  属性方法 
    span() #匹配内容的起止位置
    start() #匹配内容的开始位置
    end()  #匹配内容的结束位置
    groupdict() #获取捕获组字典键值
    groups ()#获取每个子组匹配到的内容,返回一个元组
    group() #获取整个匹配内容,也可通过组名来获取
      功能:获取match对象对应的内容
      参数:默认为0表示获取整个正则匹配的内容
          如果为序列号或者子组名则为获取某个子组匹配的对应内容
      返回值:返回得到的子串


    

    flags:标志位,用于控制正则表达式的匹配方式
    *  re.I ==IGNORECASE 忽略大小写
       re.L 做本地户识别
    *  re.M == MULTTLINE 多行匹配,影响 ^ 和 $,使其可以匹配每一行开头结尾位置
    *  re.S ==DOTALL 是.匹配包括换行符在内的所有字符
       re.U 根据Unicode字符集解析字符,影响 \w \W \b \B
       re.X 使我们以更灵活的格式理解正则表达式,在正则中添加注释时使用,一般很少使用
    使用多个标志位使用按拉或连接

 

 



 

posted @ 2018-08-25 17:18  Sky__liu  阅读(177)  评论(0)    收藏  举报