python正则表达式基础

正则表达式

动机

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

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

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

目标 :

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

特点:

  • 方便文本处理
  • 支持语言众多
  • 使用灵活多样

python —》 re模块

re.findall(pattern,string)
功能: 使用正则表达式匹配目标字符串内容
参数: pattern 正则表达式
string 目标字符串
返回值: 列表, 列表中为匹配到的内容

元字符的使用

  1. 普通字符

元字符 : a b c
匹配规则: 每个字符匹配对应的字符

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

In [3]: re.findall(“ad|cd”,“abcdefghialkjasbab”)
OUT[3]: [‘ab’,‘cd’,‘ab’]

3.匹配单个字符

元字符: .
匹配规则: 匹配除换行外的任意字符

f.o --> foo fao f@o f o

  1. 匹配开始位置

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

In [9]: re.findall("^Tom",“Tom is a boy”)
Out[9]: [‘Tom’]

  1. 匹配结束位置

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

In [10]: re.findall(“Tom$”,“hi Tom”)
Out[10]: [‘Tom’]

6.匹配重复

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

fo* --> foooooooo f fo

In [11]: re.findall(“fo*”,“fadsfafoooafo”)
Out[11]: [‘f’, ‘f’, ‘fooo’, ‘fo’]

  1. 匹配重复

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

fo+ --> fo fooooo

In [12]: re.findall(“fo+”,“fadsfafoooafo”)
Out[12]: [‘fooo’, ‘fo’]

  1. 匹配重复

元字符 : ?
匹配规则: 匹配前面的字符出现0次或1次
fo? --> f fo

In [13]: re.findall(“fo?”,“fasdffoafooooo”)
Out[13]: [‘f’, ‘f’, ‘fo’, ‘fo’]

9.匹配重复

元字符 : {n}
匹配规则: 匹配指定的重复次数
fo{3} --> fooo

In [14]: re.findall(“fo{2}”,“fasdffoafooooo”)
Out[14]: [‘foo’]

10.匹配重复

元字符 :{m,n}
匹配规则 : 匹配前面的正则表达式 m–n次
fo{2,4} --> foo fooo foooo

In [16]: re.findall(“fo{2,4}”,“fasdfofoooafooooo”)
Out[16]: [‘fooo’, ‘foooo’]

11.匹配字符集合

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

[abc123] a b c 1 2 3 12
[a-z]
[A-z]
[0-9]
[_123a-z]

In [21]: re.findall("1[a-z]*",“Boy”)
Out[21]: [‘Boy’]

12.匹配字符集

元字符 : [^…]
匹配规则 : 字符集取非,除了列出的字符之外任意一个字符

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

In [22]: re.findall("[^ ]+",“a little boy”)
Out[22]: [‘a’, ‘little’, ‘boy’]

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

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

n [24]: re.findall(“1\d{10}”,“18888886666”)
Out[24]: [‘18888886666’]

In [25]: re.findall("\D+",“Num9”)
Out[25]: [‘Num’]

14.匹配任意 (非) 普通字符

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

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

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

In [29]: re.findall("\w+\s+\w+",“hello world”)
Out[29]: [‘hello world’]

In [26]: re.findall("\S+",“hello this is tom”)
Out[26]: [‘hello’, ‘this’, ‘is’, ‘tom’]

  1. 匹配字符串位置

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

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

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

In [32]: re.findall("\A\d+\Z",“123445”)
Out[32]: [‘123445’]

  1. 匹配 (非) 单词边界

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

       \B 匹配非单词边界位置

IIn [34]: re.findall(r"num\b",“num#asdf#”)
Out[34]: [‘num’]

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

元字符总结

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

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

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

其他: | () \

正则表达式转义

正则中的特殊符号:

. * + ? ^ $ [] {} () |

正则表达式如果匹配特殊字符需要加 \ 表达转义
正则 目标字符串
e.g. $\d+ ----> $10

python pattern string
“\$\d+” “$10”

raw r"$\d+" “$10”

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

贪婪与非贪婪

贪婪模式 : 正则表达式的重复匹配总是尽可能多的向后
匹配更多内容

    • ? {m,n}

非贪婪 (懒惰模式) : 尽可能少的匹配内容

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

贪婪
In [36]: re.findall(r"ab{3,5}?",“abbbbbbbb”)
Out[36]: [‘abbb’]

非贪婪
In [37]: re.findall(r"ab{3,5}",“abbbbbbbb”)
Out[37]: [‘abbbbb’]

正则表达式的子组

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

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

子组作用

1.作为内部整体可以改变某些元字符的行为

In [42]: re.search(r"(ab)+\d+",“ababab1234”).group()
Out[42]: ‘ababab1234’

In [44]: re.search(r"\w+@\w+.(com|cn)",“abc@123.com”).group()
Out[44]: ‘abc@123.com’

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

In [46]: re.search(r"(https|http|ftp)😕/\S+",
“https://www.baidu.com”).group(1)

Out[46]: ‘https’

子组使用注意事项

  • 一个正则表达式中可以有多个子组
  • 子组一般由外到内,由左到右称之为第一,第二,第三。
    …子组
  • 子组不能重叠,嵌套也不宜很多

捕获组 和非捕获组

格式 : (?pparrern)

e.g.
re.search(r"(?pab)cdef",‘abcdefghti’).group(‘dog’)
Out[95]: ‘ab’

作用 : 可以通过组名更方便获取某组内容

正则表达式设计原则

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

re模块

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

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

re.findall(pattern,string,flags)
功能 : 从目标字符串查找正则匹配内容
参数 : 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)
功能: 替换正则匹配到的目标子串部分
参数: pattern
replaceStr : 要替换的内容
string
max 最多替换几处 默认全部替换
flags 标志位
返回值 : 返回替换后的字符串

re.subn(pattern,replaceStr,string,max,flags)
功能: 替换正则匹配到的目标子串部分
参数: 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 : 捕获组形成组名和序列号的字典
组名为键, 第几组为值


  1. A-Z ↩︎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值