正则表达式:元字符 转义 贪婪和非贪婪 正则表达式分组 re模块的使用

正则表达式

 

动机

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

 

 

定义

即文本的高级匹配模式,提供搜索,替代,查找等功能

本质是由以系列特殊符号和字符组成的字串

 

 

目标

  1. 熟练掌握正则表达式符号
  2. 能够看懂或者简单编写基本的正则表达式
  3. 能够使用Python操作正则表达式

 

 

特点

  1. 方便进行检索修改文本的操作
  2. 支持编程语言众多
  3. 使用灵活多样

 

 

 

 

python ---- > re 模块

处理正则表达式

re.dindall(pattern,string)

功能: 使用正则表达式匹配字符串

参数: pattern 正则表达式字符串

       String   目标字符串

返回值:  返回匹配到的所有内容

 

例子:

import re

s = "my enail is Levi@126.com or lvze@tedu.cn"

re.findall("\w+@\w+\.\w{2,3}",s)

['Levi@126.com', 'lvze@tedu.cn']

 

 

 

 

 

 

 

元字符

(正则表达式中有一定含义的符号)

  1. 普通字符

元字符  a  b  c  &  #

匹配规则: 匹配字符本身

例子:

In [5]: re.findall("abc","abcbdkd")

Out[5]: ['abc']

元字符

匹配规则: 匹配 | 两边任意一个正则表达式

例子:

In [12]: re.findall('ab|cd',"abfscdaadsab")

Out[12]: ['ab', 'cd', 'ab']

 

 

重复的字符不可匹配

In [13]: re.findall('abc|bcd',"abcdefabc")

Out[13]: ['abc', 'abc']

 

  1. |左右不要有空格

 

  1. 匹配单一字符

元字符: .

匹配规则:  匹配出\n外任意一个字符

例子:

In [14]: re.findall('f.o',"fao is not foo")

Out[14]: ['fao', 'foo']

 

  1. 匹配开始位置

元字符: ^

匹配规则: 匹配一个字符串的开头位置

例子:

In [15]: re.findall('^hello',"hello world")

Out[15]: ['hello']

 

In [16]: re.findall('^hello',"hello world hello")

Out[16]: ['hello']

 

  1. 匹配结尾位置

元字符: $

匹配规则: 匹配字符串的结束位置

例子:

In [25]: re.findall("py$","hello.py")

Out[25]: ['py']

 

In [26]: re.findall("......py$","hello.py")

Out[26]: ['hello.py']

 

  1. 匹配重复

元字符:  *

匹配规则: 匹配前面的正则表达式重复0此或者是多次

例子:

In [27]: re.findall("ab*","abbsafab")

Out[27]: ['abb', 'a', 'ab']

 

  1. 匹配重复

元字符: +

匹配规则: 匹配前面的正则表达式1次或多次

例子:

In [28]: re.findall("ab+","abbsafab")

Out[28]: ['abb', 'ab']

 

  1. 匹配重复

元字符: ?

匹配规则: 匹配前面出现的元字符0次或1次

例子

In [31]: re.findall("ab?","abbsafab")

Out[31]: ['ab', 'a', 'ab']

 

  1. 匹配重复

元字符: {n}

匹配规则: 匹配前面的正则表达式n次

例子:

In [32]: re.findall("ab{3}","abbbsafab")

Out[32]: ['abbb']

 

  1. 匹配重复

元字符:{m,n}

匹配规则: 匹配前面的正则表达式 m  n 次

例子:

In [35]: re.findall("ab{2,4}","abbbsabbfab")

Out[35]: ['abbb', 'abb']

 

  1. 匹配字符集合:

元字符:[字符集]

匹配规则: 匹配括号内任意一个字符

例子:

In [36]: re.findall("[a-z]","hello 123")

Out[36]: ['h', 'e', 'l', 'l', 'o']

 

In [37]: re.findall("[a-z]+","hello 123")

Out[37]: ['hello']

 

  1. 匹配字符集合

元字符:[^ ]

匹配规则: 除了字符集中的任意一个字符

例子:

In [38]: re.findall("[^abcdef]","a little boy")

Out[38]: [' ', 'l', 'i', 't', 't', 'l', ' ', 'o', 'y']

 

In [39]: re.findall("[^abcdef]+","a little boy")

Out[39]: [' littl', ' ', 'oy']

 

  1. 匹配任意(非)数字字符

元字符:  \d  \D

匹配规则:  \d  匹配任意数字字符

          \D  匹配任意非数字字符

   例子:

  In [43]: re.findall("1\d{10}","a 12345678987654321")

Out[43]: ['12345678987']

 

In [45]: re.findall("\D+","The num is 123456")

Out[45]: ['The num is ']

 

 

  1. 匹配(非)普通字符  (数字字母下划线)

元字符: \w     \W

匹配规则:\w 匹配任意一个普通字符[_0-9a-aA-Z]

          \W 匹配任意一个非普通字符[^_0-9a-aA-Z]      

例子:

In [3]: re.findall('\w+',"Today is wednesday")

Out[3]: ['Today', 'is', 'wednesday']

 

In [6]: re.findall('\W+',"@#$%^&*")

Out[6]: ['@#$%^&*']

 

  1. 匹配(非)空字符   (空格, \r  \t  \n  \0)

元字符:\s  \S  

匹配规则:  \s 匹配任意空字符

          \S 匹配任意非空字符

例子:

 

In [7]: re.findall('\s+',"hello   wold")

Out[7]: ['   ']

 

In [8]: re.findall('\S+',"hello   wold")

Out[8]: ['hello', 'wold']

 

  1. 匹配起止位置

元字符: \A(^)  \Z($)

匹配规则: 匹配字符串的开始和结束位置

  例子:

In [12]: re.findall('\Ahello world\Z',"hello world")

Out[12]: ['hello world']

 

  1.  绝对匹配: 正则表达式前后加 ^$或\A\Z  表示正则表达式   需要匹配目标字符串的全部内容

 

 

  1. 匹配(非)单词边界 (普通字符和其它字符交接的位置)

元字符: \b  \B

匹配规则:\b 单词边界

          \B 非单词边界

例子:

In [13]: re.findall(r'\bis\b',"This is Tom")

Out[13]: ['is']

 

 

元字符总结:

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

              […]  [^…]

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

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

  

正则表达式转义

特殊符号

.   *   ?   $   []   ()   {}   ^  \

 

例子:

In [4]: re.findall('ok\\?',"Are your ok?")

Out[4]: ['ok?']

r  ---- >raw  字符串

原生字符串,字符串的内容就是字符串本身,不进行任何转义处理

 

贪婪和非贪婪

贪婪模式

正则表达式的重复默认总是尽可能多的向后匹配内容

非贪婪模式

尽可能少的匹配内容

 

 

 

 

贪婪转为非贪婪

 

后面加?

(1)非贪婪

In [16]: re.findall(r'ab*?',"abbcavvaa")

Out[16]: ['a', 'a', 'a', 'a']

 

(2)贪婪

In [17]: re.findall(r'ab*',"abbcavvaa")

Out[17]: ['abb', 'a', 'a', 'a']

 

 

正则表达式分组

方法

可以使用()为一个正则表达式子组,

子组可以看做正则表达式的一个局部整体

子组的作用

  1. 子组作为局部整体可以改变某些元字符的行为,比如重复,或等

例子:

In [21]: re.search(r'(ab)+','abbbbbcdef').group()

Out[21]: 'ab'

 

In [22]: re.search(r'(ab)+','ababababcdef').group()

Out[22]: 'abababab'

 

In [23]: re.search(r'.+(\.com|\.cn)','abc@123.cn').group()

Out[23]: 'abc@123.cn'

  1. 子组在某些操作中可以单独提取匹配内容

 

例子:

In [27]: re.search(r'(ab)+','ababababcdef').group(1)

Out[27]: 'ab'

子组的使用注意事项

  1.  一个正则表达式可以有多个子组,正则表达式依然是通过整体匹配内容

 

  1. 子组由外到内,由左到右为第一第二第三..子组

((ab)cd(ef)g)  abcefg   ab  ef  

 

  1. 子组内容不会重叠

捕获组合非捕获组

(命名组,非命名组)

格式: (?P<name>pattern)

 

例子:

In [29]: re.search(r'(?P<dag>ab)cdef+','ababababcdef').group()

Out[29]: 'abcdef'

命名作用

  1. 很多编程接口可以通过名称获取指定组的内容

 

  1. 命名组可以被重复调用

  格式:(?P=name)

 

例子:

In [32]: re.search(r'(?P<dog>ab)cd(?P=dog)','abcdabefg').group()

Out[32]: 'abcdab'

正则表达式设计原则

  1. 正确性,能够正确的匹配要求内容

 

  1. 唯一性,除了需要匹配的内容,尽可能不匹配不需要的没人

 

  1. 全面性, 对目标特征考虑不遗漏

 

 

re模块

方式

regex = re . comoile(pattern,flags = 0)

功能: 生成正则表达式

参数: pattern  正则表达式

       flags     功能标志位,丰富正则的匹配功能

返回值: 返回正则表达式对象

 

******************************************

list = re . findall(pattern,string,flags)

功能: 根据正则表达式匹配目标字符串

参数: pattern  正则表达式

       string   目标字符串

返回值: 返回一个列表,内部为匹配到的内容

 

  1. 如果正则表达式有分组则只显示子组内容

 

****************************************

list = regex . findall(string,pos=0,endpos = 9999.)

功能: 根据正则表达式匹配目标字符串

参数: string   目标字符串

       pos   标明从目标字符串的哪个位置开始匹配

       endpos  标明匹配到目标字符串的哪里

返回值: 返回一个列表,内部为匹配到的内容

 

re.split(pattern,atring,flsgs=0)

功能: 通过正则表达式分隔字符串

参数: pattern    正则

       String      目标字符串

返回值:  分隔后字符串列表

 

***************************************

re.sub(pattern , replaceStr , atring , max , flags)

功能: 替换正则表达式匹配到的内容

参数: pattern  正则

       replaceStr 要替换的内容

       string   目标字符串

       max   最多替换几处

返回值:  返回替换的字符串

 

*****************************************

re.subn(pattern , replaceStr , atring , max , flags)

功能: 替换正则表达式匹配到的内容

参数: pattern  正则

       replaceStr 要替换的内容

       string   目标字符串

       max   最多替换几处

返回值:  返回替换的字符串和几处

 

******************************************

re.finditer(pattern , string , flags)

功能: 使用正则表达式匹配目标字符串

参数:  pastern  正则

        String    目标字符串

返回值: 将匹配内容生成迭代器

 

********************************************

 re.fullmatch(pattern , string , flags)

功能: 完全匹配目标字符串

参数: pattern 正则

       String  目标字符串

返回值: 匹配到的内容(match object)

 

*******************************************

obj = re.match (pattern , string , flags)

功能: 匹配目标字符串开头

参数: pattern 正则

       String  目标字符串

返回值: 匹配到的内容(match object)

obj = re.search (pattern , string , flags)

功能: 匹配目标字符串,只能匹配第一处

参数: pattern 正则

       String  目标字符串

返回值: 匹配到的内容(match object)

 

 

  1.  生成match 对象如果失败则返回None ,则无法调用match对象属性,此时会产生异常。

Compile

生成的正则对象属性

pattern   正则对象对应的正则表达式

flags    获取标志位值

groupinddex  获取捕获组形成的字典

groups  多少字组

 

match对象

属性变量

 

pos : 目标字符串的开头位置

endpos : 目标字符串结束位置

re : 正则表达式对象

string : 目标字符串

lastgroup:最后一组名字

lastindex:最后一组是第几组

 

属性方法

 

start()  获取匹配到的内容的开始位置

end()    获取匹配到的内容的结束位置

span()   获取匹配到的内容的起止位置

 

group(n = 0)

功能: 获取match对象对应匹配到的内容

参数: 默认为0表示获取正则表达式整的匹配内容

如果赋值1,2,3...则表示获取某个子组的匹配内容

返回值:返回匹配字符串

 

 

groups()  获取所有子组匹配内容

groupdict() 将所有捕获组内容形成一个字典

flags 参数

 

re.compile re.findall re.search re.match

re.finditer  re.fullmatch  re.sub  re.subn re.split

 

作用: 辅助正则表达式,丰富匹配结果

A == ASCII

S == DOTALL   元字符.可以匹配\n

I == IGNORECASE   或略大小写

L == LOCALE

M == MULTILINE

元字符^  $ 可以匹配每一行的开头结尾位置

T == TEMPLATE

U == UNICODE

X == VERBOSE   

可以给正则添加注释

同时使用多个flag 用 |

re.I | re.S

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值