python之正则表达式

1 篇文章 0 订阅

1、普通字符匹配(除了后续讲解的特殊字符全是普通字符)
可以用普通字符来匹配对应的字符
In [5]: re.findall(‘abc’, ‘abcdefab’)
Out[5]: [‘abc’]
In [6]: re.findall(‘成都’, ‘成都的街头’)
Out[6]: [‘成都’]

2、或
元字符:|
匹配规则:匹配符号两侧的正则表达式均可
In [8]: re.findall(‘ab|cd’, ‘abcdefab’)
Out[8]: [‘ab’, ‘cd’, ‘ab’]

3、匹配单个字符
元字符:.
匹配规则:匹配除 \n 外任意一个字符
In [9]: re.findall(“w.o”, ‘woo,wao is not wbo’)
Out[9]: [‘woo’, ‘wao’, ‘wbo’]
In [10]: re.findall(“你.”,’你好,你坏’)
Out[10]: [‘你好’, ‘你坏’]

4、匹配开始位置
元字符:^
匹配规则:匹配目标字符串的开头位置
In [11]: re.findall(“^Jame”,’Jame,how are you’)
Out[11]: [‘Jame’]
In [12]: re.findall(“^Jame”,’hi,Jame,how are you’)
Out[12]: []

5、匹配结束位置
元字符: In[15]:re.findall(py 匹 配 规 则 : 匹 配 目 标 字 符 串 的 结 束 位 置 I n [ 15 ] : r e . f i n d a l l ( “ p y ”,’hello.py’)
Out[15]: [‘py’]
In [16]: re.findall(“py$”,’hello.pyc’)
Out[16]: []

6、匹配重复
元字符:*
匹配规则:匹配前面出现的正则表达式0次或多次
fo* —> f fo foo fooooooooooooooo
In [20]: re.findall(“ab*”,’abcdefae*9abbbbbbbbb’)
Out[20]: [‘ab’, ‘a’, ‘abbbbbbbbb’]
In [22]: re.findall(“a*”,’abcdae*9aabbb’)
Out[22]: [‘a’, ”, ”, ”, ‘a’, ”, ”, ”, ‘aa’, ”, ”, ”, ”]

7、匹配重复
元字符:+
匹配规则:匹配前面出现的正则表达式1次或多次
ab+ —> ab abb abbbbbbbbb
In [24]: re.findall(“ab+”,’gd34abcdefae*9abbbbbbbbb’)
Out[24]: [‘ab’, ‘abbbbbbbbb’]
In [25]: re.findall(“.+py$”,’hello.py’)
Out[25]: [‘hello.py’]

8、匹配重复
元字符:?
匹配规则:匹配前面出现的正则表达式0次或1次
ab? —> a ab
In [26]: re.findall(“ab?”,’abces,adsfabbbbbb’)
Out[26]: [‘ab’, ‘a’, ‘ab’]
In [27]: re.findall(“https?://.+”,’http://www.baidu.com‘)
Out[27]: [‘http://www.baidu.com‘]
In [28]: re.findall(“https?://.+”,’https://www.baidu.com‘)
Out[28]: [‘https://www.baidu.com‘]

9、匹配重复
元字符:{n}
匹配规则:匹配前面的正则出现n次
ab{3} —> abbb
In [29]: re.findall(“ab{3}”,’abces,adsfabbbbbb’)
Out[29]: [‘abbb’]

10、匹配重复
元字符:{m,n}
匹配规则:匹配前面的正则m-n次
ab{3,5} —> abbb abbbb abbbbb

11、匹配字符集合
元字符:[字符集]
匹配规则:匹配字符集中任意一个字符
[abc123] —> a b c 1 2 3
In [33]: re.findall(‘[aeiou]’,’hello world’)
Out[33]: [‘e’, ‘o’, ‘o’]
[0-9]
[a-z]
[A-Z]
[0-9a-z]
In [34]: re.findall(‘^[A-Z][a-z]*’,’Hello world’)
Out[34]: [‘Hello’]
[_abc0-9]

12、匹配字符集
元字符:[^…]
匹配规则:匹配除了中括号中字符集字符之外的任意一个字符
In [36]: re.findall(‘[^!@#$]+’,’hello@ world’)
Out[36]: [‘hello’, ’ world’]

13、匹配任意(非)数字字符
元字符:\d \D
匹配规则:\d匹配任意一个数字字符 等同于[0-9]
\D匹配任意一个非数字字符 等同于[^0-9]
In [42]: re.findall(‘1\d{10}’,’13727377734’)
Out[42]: [‘13727377734’]
In [43]: re.findall(‘\D+’,’hello world’)
Out[43]: [‘hello world’]

14、匹配任意(非)普通字符(数字字母下划线 普通utf-8字符)
元字符:\w \W
匹配规则:\w匹配一个普通字符
\W匹配一个非普通字符
In [47]: re.findall(‘\w+’,’hello 1)Out[47]:[hello,1]In[48]:re.findall(\W+,hello 1 ′ ) O u t [ 47 ] : [ ‘ h e l l o ′ , ‘ 1 ′ ] I n [ 48 ] : r e . f i n d a l l ( ‘ \W + ′ , ′ h e l l o 1’)
Out[48]: [‘$’]
In [49]: re.findall(‘\w+’,’武昌中心’)
Out[49]: [‘武昌中心’]

15、匹配(非)空字符(空格 \r \n \v \t \f)
元字符:\s \S
匹配规则: \s匹配任意一个空字符
\S匹配任意一个非空字符
In [51]: re.findall(‘\w+\s+\w+’,’hello world’)
Out[51]: [‘hello world’]
In [52]: re.findall(‘\S+’,’hello world’)
Out[52]: [‘hello’, ‘world’]

16、匹配起止位置
元字符:\A \Z
匹配规则: \A 匹配字符串开头位置 ^
\Z 匹配字符串结尾位置 $
In [55]: re.findall(‘\Ahi’,’hiello 1’)
Out[55]: [‘hi’]
In [57]: re.findall(‘is\Z’,’thiello is’)
Out[57]: [‘is’]
完全匹配:使用一个正则表达式可以匹配目标字符串的全部内容
In [59]: re.findall(‘\A\w{5}\d{3}\Z’,’hello123’)
Out[59]: [‘hello123’]

17、匹配(非)单词边界(普通字符和非普通字符的交界位置认为是单词边界)
元字符:\b \B
匹配规则:\b 匹配单词边界位置
\B 匹配非单词边界位置
“This is a test”
In [63]: re.findall(r’\bis\b’, ‘This is a test’)
Out[63]: [‘is’]
In [64]: re.findall(r’\Bis\b’, ‘This is a test’)
Out[64]: [‘is’]
In [68]: re.findall(r’is\b’, ‘This is a test’)
Out[68]: [‘is’, ‘is’]

元字符总结:

匹配单个字符:a . [..] [^..] \d \D \w \W \s \S
匹配重复: * + ? {n} {m,n}
匹配位置:^ $ \A \Z \b \B
其他: | () \

正则表达式的转义

正则表达式特殊字符
. * ? $ ^ [] {} () \
在正则表达式中如果想匹配这些特殊字符需要进行转义
In [3]: re.findall(‘[\d+]’,’abc[123]’)
Out[3]: [‘[123]’]

raw 字符串 —-》 原始字符串

特点:对字符串中的内容不进行转义,即表达原始含义
r”\b” —> \b
“\b” —> \b
In [14]: re.findall(r”\w+@\w+.cn”,’lvze@tedu.cn’)
Out[14]: [‘lvze@tedu.cn’]

In [15]: re.findall(“\w+@\w+\.cn”,’lvze@tedu.cn’)
Out[15]: [‘lvze@tedu.cn’]

贪婪和非贪婪

贪婪模式:正则表达式的重复匹配,总是尽可能多的向后匹配内容。
* + ? {m,n}

贪婪 —-> 非贪婪(懒惰) 尽可能少的匹配内容
*? +? ?? {m,n}?
In [21]: re.findall(r’ab*’,’abbbbbbb’)
Out[21]: [‘abbbbbbb’]

In [22]: re.findall(r’ab*?’,’abbbbbbb’)
Out[22]: [‘a’]

正则表达式分组

使用()可以为正则表达式建立子组,子组不会影响正则表达式整体的匹配内容,可以被看做是一个内部单元。

子组的作用:

1、形成内部整体,代表某些元字符的行为
In [26]: re.search(r’(ab)+’,’abababab’).group()
Out[26]: ‘abababab’
In [27]: re.search(r’\w+@\w+.(com|cn)’,’adfjd@xxc.cn’).group()
Out[27]: ‘adfjd@xxc.cn’
In [28]: re.search(r’\w+@\w+.(com|cn)’,’adfjd@xxc.com’).group()
Out[28]: ‘adfjd@xxc.com’

2、子组匹配内容可以被单独获取
In [30]: re.search(r’\w+@\w+.(com|cn)’,’adfjd@xxc.com’).group(1)
Out[30]: ‘com’

子组注意事项

  • 一个正则表达式中可以有多个子组,区分第一,第二,,,子组
  • 子组不要出现重叠的情况,尽量简单

捕获组和非捕获组(命名组,未命名组)
格式:(?Ppattern)
In [31]: re.search(r’(?Pab)+’,’abababab’).group()
Out[31]: ‘abababab’

作用:

1、方便通过名字区分每个子组
2、捕获组可以重复调用
格式:(?P=name)
e.g. (?Pab)cd(?P=dog) ===> abcdab
In [35]: re.search(r’(?Pab)cdef(?P=dog)’,’abcdefab’).group()
Out[35]: ‘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(spattern,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 获取捕获组字典,键为组名值是第几组

match对象

属性

pos 目标字符串的起始位置
endpos 目标字符串的结束位置
re 正则表达式
string 目标字符串
lastgroup 最后一组的名称
lastidnex 最后一组是第几组

方法

span() 匹配到内容的起止位置
start() 匹配到内容的开始位置
end() 匹配到内容的结束位置
group(n=0)
功能:获取match对象对应的匹配内容
参数:默认为0,表示获取整体的匹配内容
如果赋值1,2,3..表示获取第n个子组匹配内容
返回:返回获取到的内容字串
groups() 获取所有子组匹配到的内容
groupdict() 获取所有捕获组匹配内容,形参一个字典

flags参数

re.compile re.findall re.search re.match
re.finditer re.fullmatch re.split re.sub re.subn
作用:辅助正则表达式,扩展丰富匹配内容
I == IGNORECASE 忽略字母大小写
S == DOTALL 让元字符 . 能够匹配\n
M == MULTILINE 让元字符 ^ $ 能够匹配每一行的开头结尾
X == VERBOSE 能够为正则添加注释

flags 传递多个标识符
re.I | re.M

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值