正则表达式

正则表达式

产生的原因:

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

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

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

元字符的使用

元字符含义案例
.除了\n,可以匹配任意单字符abc123@#$都能匹配
*0-多次[a-z][0-9]*
+1-多次[a-z][0-9]+
?0-1次[2][a-z]?
[]表示范围[a-z] a-z中的任意一个小写字母
()分组,或者提升优先级
|或者[a-z] | [0-9] 表示任意一个小写字母或者任意一个数字
{0,}和 * 一样
{1,}和 + 一样
{0,1}和 ? 一样
\d数字中的一个[0-9]
\D非数字[^0-9]
\s空白符匹配任意空字符 [ \r\t\n\v\f]
\S非空白符与\s相反
\w任意普通字符匹配任意普通字符 [_0-9a-zA-Z] 也能匹配普通汉字
\W任意非普通字符与\w相反
^取反,开始
$结束
{m,n}m-n次

1.元字符: |

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

In [21]: re.findall("ab|cd","abcdefghialkjasbab")
Out[21]: ['ab', 'cd', 'ab']

2.元字符: .

匹配规则:匹配除\n外的任意单字符

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

3.元字符 : ^

匹配规则:匹配目标字符串的开头位置

In [30]: re.findall("^Tom","Tom is a boy")
Out[30]: ['Tom']

4.元字符 : $

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

In [32]: re.findall("Tom$","hi Tom")
Out[32]: ['Tom']

5.元字符 : *

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

In [33]: re.findall("fo*","fadsfafoooafo")
Out[33]: ['f', 'f', 'fooo', 'fo']

6.元字符 : +

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

In [36]: re.findall("fo+","fadsfafoooafo")
Out[36]: ['fooo', 'fo']

7.元字符 : ?

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

In [42]: re.findall("fo?","fasdffoafooooo")
Out[42]: ['f', 'f', 'fo', 'fo']

8.元字符 : {n}

匹配规则: 匹配前面的字符重复次数

In [43]: re.findall("fo{2}","fasdffoafooooo")
Out[43]: ['foo']

9.元字符 : {m,n}

匹配规则 : 匹配前面的字符出现 m–n次

In [46]: re.findall("fo{2,4}","fasdfofoooafooooo")
Out[46]: ['fooo', 'foooo']

10.元字符: [字符集]

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

In [51]: re.findall("^[A-Z][a-z]*","Boy")
Out[51]: ['Boy']

11.元字符 : [^…]

匹配规则 :字符集取非,除列出的字符之外任意一个字符

[^abc] --> 除a b c之外任意字符

In [54]: re.findall("[^ ]+","a little boy")
Out[54]: ['a', 'little', 'boy']

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

元字符 : \d \D
匹配规则: \d 匹配任意数字字符 [0-9]
\D 匹配任意非数字字符 [^0-9]

In [57]: re.findall("1\d{10}","18888886666")
Out[57]: ['18888886666']
  1. 匹配任意(非)普通字符

元字符 : \w \W
匹配规则: \w 匹配任意普通字符 [_0-9a-zA-Z] 也能匹配普通汉字
\W 匹配任意非普通字符

re.findall("\w+","hello#nihao%asdf@adsgdfg!df&")
Out[60]: ['hello', 'nihao', 'asdf', 'adsgdfg', 'df']
    
re.findall("\W+","hello#nihao%asdf@adsgdfg!df&")
Out[63]: ['#', '%', '@', '!', '&']

14.匹配任意(非)空字符

元字符 : \s 匹配任意空字符 [ \r \t \n \v \f]
\S 匹配任意非空字符

In [65]: re.findall("\w+\s+\w+","hello   world")
Out[65]: ['hello   world']
    
In [66]: re.findall("\S+","hello this is tom")
Out[66]: ['hello', 'this', 'is', 'tom']

15.匹配字符串位置

元字符 : \A \Z
匹配规则: \A 匹配字符串开头位置 ^
\Z 匹配字符串结尾位置 $

在正则表达式开始和结束位置加上^ $ (或者\A \Z)。表示完全匹配

In [75]: re.findall("\A\d+\Z","123445")
Out[75]: ['123445']

16.匹配(非)单词边界

元字符 : \b \B
匹配规则 : \b 匹配单词边界位置 普通字符和非普通字符交界认为是单词边界
\B 匹配非单词边界位置

In [81]: re.findall(r"num\b","num#asdf#")
Out[81]: ['num']

In [82]: re.findall(r"num\b","numasdf#")
Out[82]: []

元字符总结


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

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

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

其他 : |  ()  \

贪婪与非贪婪

贪婪模式:尽可能匹配多的

非贪婪模式:尽可能匹配少的

贪婪 ——> 非贪婪 *? +? ?? {m,n}?

正则表达式的子组

可以使用()为正则表达式建立子组,子组可以看做是正则表达式内部操作的一个整体

**子组是在正则表达式整体匹配到内容的前提下才会发挥作用,它不影响正则表达式整体去匹配目标内容这一原则

捕获组 和 非捕获组

格式 : (?P<name>pattern)

re.search(r"(?P<dog>ab)cdef",'abcdefghti').group('dog')
Out[130]: 'ab'

正则表达式设计原则

  1. 正确性 ,能正确匹配到目标内容
  2. 排他性 ,除了要匹配的内容,尽可能不会匹配与到其他内容
  3. 全面性 ,需要对目标的各种情况进行考虑,做到不遗漏
re 模块

在这里插入图片描述

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

re.findall(pattern,string,flags=0)
功能 :从目标字符串查找正则匹配内容
参数 : pattern  正则表达式
       string  目标字符串
	   flags  标志位
返回值 : 返回匹配到的内容,如果正则有子组则只返回子组对应内容

regex.findall(string,pos,endpos)
功能 :从目标字符串查找正则匹配内容
参数 : string  目标字符串
       pos  匹配目标的起始位置
       endpos  匹配目标的终止位置
返回值 : 返回匹配到的内容,如果正则有子组则只返回子组对应内容

re.split(pattern,string,flags = 0)
功能:根据正则匹配内容切割字符串
参数: pattern  string  flags
返回值: 返回列表,列表中为切割的内容

re.sub(pattern,replaceStr,string,max,flags=0)
功能: 替换正则匹配到的目标子串部分
参数: pattern
      replaceStr : 要替换的内容
      string 
      max   最多替换几处 默认全部替换
      flags
返回值 : 返回替换后的字符串

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


re.finditer(pattern,string,flags)
功能: 使用正则表达式匹配目标字符串
参数: pattern  string flags
返回值: 返回一个迭代对象,迭代到的内容是一个match对象

fullmatch(pattern,string,flags)
功能: 完全匹配目标字符串
参数: pattern,string,flags
返回值:返回匹配到的match对象,如果没匹配成功返回None

match(pattern,string,flags)
功能: 从开头位置匹配目标字符串
参数: pattern,string,flags
返回值:返回匹配到的match对象,如果没匹配成功返回None


search(pattern,string,flags)
功能: 正则表达式匹配目标字符串,只匹配第一处
参数: pattern,string,flags
返回值:返回匹配到的match对象,如果没匹配成功返回None

compile对象属性:

flags  : 标志位
pattern : 正则表达式
groups: 有多少子组
groupindex : 捕获组形成组名和序列号的字典
              组名为键,第几组为值
              
match对象属性

属性变量
pos     匹配目标字符串的开始位置
endpos  匹配目标字符串的结束位置
re      正则表达式
string  目标字符串
lastgroup  最后一组的组名
lastindex  最后一组是第几组

属性方法
start()  匹配内容的开始位置
end()    匹配内容的结束位置
span()   匹配内容的起止位置

group()
功能 : 获取match对象对应的内容
参数 : 默认为0 表示获取整个正则匹配的内容
        如果为序列号或者子组名则为获取某个子组匹配的对应内容
返回值:返回得到的子串

groupdict()  获取捕获组名作为键,对应内容作为值的字典
groups()   获取每个子组匹配内容


flags  参数的使用
re.compile  re.findall  re.search  re.match
re.finditer  re.fullmatch  re.sub  re.subn  re.split

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

I ==  IGNORECASE  匹配时忽略字母的大小写
S ==  DOTALL     作用于元字符 . 使其可以匹配换行 
M ==  MULTILINE  作用于^  $  使其可以匹配每一行开头结尾位置
X ==  VERBOSE    可以给正则添加注释

使用多个标志位使用按位或连接

e.g.
flags = re.X | re.I

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值