python常用模块-re正则匹配

本文详细介绍了Python内置的re模块,包括正则表达式的常用元字符、反义元字符和量词。重点讲解了re模块的常用函数,如compile()、match()、search()、findall()、finditer()、split()、sub()和subn(),并提供了实例演示。同时,文中还提到了匹配模式的注意事项,如贪婪匹配和非贪婪匹配的区别。

前言

  • re模块是python本地库中匹配字符串的模块,学习re模块的前提必须要学习一些基础的正则表达式,明白正则表达式中的一些概念,你才能更好的掌握这个模块。

正则表达式

常用元字符
元字符匹配内容
.匹配除换行符外的任意字符
\b匹配单词的开始或结束
\d匹配数字,等价于 [0-9]。
\s匹配空白符,等价于 [ \f\n\r\t\v]
\w匹配字母或数字,等价于 “[A-Za-z0-9_]”
^匹配字符串的开始
$匹配字符串的结束
反义元字符
元字符描述
\B匹配不是单词的开始或结束的位置
\D匹配非数字的任意字符,等价于 [^0-9]。
\S匹配不是空白符的字符,等价于 [^ \f\n\r\t\v]
\W匹配非字母或数字任意字符,等价于 [^A-Za-z0-9_]
\A仅匹配字符串开头,同^
\Z仅匹配字符串结尾,同$
[^aeiou]匹配非aeiou得任意字符
常用量词
代码描述
*重复零次或更多次
+重复一次或更多次,等价于 {1,}
?重复零次或一次等价于 {0,1}
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
  • \ : 斜杠字符转义
  • ():括号代表分组
  • | : 或者的意思
  • []: 字符集
  • ? : 正则表达式默认规则是贪婪匹配,在后面加个问号可取消贪婪匹配
# 常用正则表达式
compile = ".*?"

. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式。

全意:除换行符外匹配尽量少的任意字符

# 最常写的方式是在后面加一个字符作为终止字符:
.*?a

举例:

匹配IP地址:192.168.120.121

# 简易IP正则
(\d{3}\.){3}\d{3}
# 精确IP正则表达式
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

身份证

^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$

邮箱

[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?

简易手机号正则表达式

1\d{10}
/^[1]([3-9])[0-9]{9}$/

re模块

常用函数

  • 注意:传入的被匹配对象必须是字符串str类型
函数描述
compile(pattern,[flags])根据包含正则表达式的字符串创建模式对象
search(pattern,string,[flags])在字符串中寻找模式
match(pattern,string,[flags])在字符串开始处匹配模式
split(pattern,string,[maxsplit = 0])根据模式的匹配项来分割字符串
finditer(pattern , string [, flags] )与 findall()函数相同,但返回的不是一个列表,而是一个迭代器。对于每一次匹配,迭代器都返回一个匹配对象
findall(pattern,string)列出字符串中模式的所有匹配项(如果regex有分组(),则返回元组的列表)
sub(pat,repl,string,[count = 0])将字符串中所有pat的匹配项用repl替换
split(pattern,string,max=0)根据正则表达式的模式分隔符,split 函数将字符串分割为列表,然后返回成功匹配的列表,分隔最多操作 max 次

re匹配对象函数

方法描述
group(num=0)返回整个匹配对象,或者编号为 num 的特定子组
groups(default=None)返回一个包含所有匹配子组的元组(如果没有成功匹配,则返回一个空元组)
start([group])返回给定组的匹配项的开始位置
end([group])返回给定组的匹配项的结束位置
span([group])返回一个组的开始和结束位置

函数详解

1、compile()

编译正则表达式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)

格式:re.compile(pattern,flags=0)
  • pattern: 正则匹配表达式。

  • flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:

标志含义
re.S (DOTALL)使.匹配包括换行在内的所有字符
re.I(IGNORECASE)使匹配对大小写不敏感
re.L(LOCALE)做本地化识别(locale-aware)匹配,法语等
re.M (MULTILINE)多行匹配,影响^和$
re.X (VERBOSE)该标志通过给予更灵活的格式以便将正则表达式写得更易于理解
re.U根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B
import re

text = "Cats are very cute animals"
partten = re.compile(r'\w*')
print(partten.search(text).group()) 

# 执行结果如下: 
Cats
2、match()

re.match 从字符串的起始位置进行匹配,匹配成功返回match对象,否则返回None。

// 注:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符’$’

如何加深理解呢?

  • 可以简单理解为开头必须完全匹配,后面可以不完全匹配,取头不必取尾;
  • 比如字符串"Cats are very cute animals" 必须从C字母开始匹配,不能从a开始;
格式:re.match(pattern, string, flags=0)
import re

print(re.match("Cats", "Cats are very cute animals").group())
print(re.match("cats", "Cats are very cute animals", re.I).group())

# 执行结果如下:
Cats
Cats
3、search()

查找整个字符串,匹配成功返回第一个match对象,失败则返回None。

格式:re.search(pattern, string, flags=0)
import re

print(re.search("animals", "Cats are very cute animals").group())

# 执行结果如下: 
animals
  • 注:match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:

    • group(): 返回被 RE 匹配的字符串
    • start(): 返回匹配开始的位置
    • end(): 返回匹配结束的位置
    • span(): 返回一个元组包含匹配 (开始,结束) 的位置
    • groups(): 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
4、findall()

查找字符串中所有匹配的对象,并返回一个列表,如果为空,则返回空列表。

  • 注意: match 和 search 是只匹配一次,而 findall 是匹配所有。
格式:re.findall(pattern, string, flags=0)
import re

p = re.compile(r'\d+')
print(p.findall('o1n2m3k4z45'))

# 执行结果如下:
['1', '2', '3', '45']

text = "Cats are very cute animals and I like it!"
print(re.findall(r'\w*n\w*', text))

# 执行结果如下:
['animals', 'and']
5、finditer()

与 findall() 函数相似,查找字符串中所有匹配的对象,并作为一个迭代器返回

  • 与 findall() 区别就是 返回的对象类型不一样
re.finditer(pattern, string, flags=0)
import re

text = "Cats are very cute animals and I like it!"
iter_ = re.finditer(r'\w*n\w*', text)
for i in iter:
    print(i)
    print(i.group())
    
# 执行结果如下: 
<re.Match object; span=(19, 26), match='animals'>
animals
<re.Match object; span=(27, 30), match='and'>
and
6、split()

按照能够匹配的子串将string分割后返回列表。

可以使用re.split来分割字符串,如:re.split(r’\s+’, text);将字符串按空格分割成一个单词列表。

格式:re.split(pattern, string[, maxsplit])
  • maxsplit用于指定最大分割次数,不指定将全部分割。
import re
print(re.split('\d+','one1two2three3four4five5')) 

# 执行结果如下: 
['one', 'two', 'three', 'four', 'five', '']
7、sub()

使用re匹配字符串中的所有对象后,进行替换,并返回替换后新的字符串。

格式:re.sub(pattern, repl, string, count=0)
import re 

text = "JGood is a handsome boy, he is cool, clever, and so on..." 
print(re.sub(r'\s+', '-', text)) 

# 执行结果如下: 
JGood-is-a-handsome-boy,-he-is-cool,-clever,-and-so-on... 

repl 参数也可以是函数

import re
 
# 将匹配的数字乘以 2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)
 
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))
8、subn()

返回替换次数

subn(pattern, repl, string, count=0, flags=0)
import re

print(re.subn('[1-2]','A','123456abcdef')) print(re.sub("g.t","have",'I get A,  I got B ,I gut C')) print(re.subn("g.t","have",'I get A,  I got B ,I gut C')) 

# 执行结果如下:
('AA3456abcdef', 2) 
I have A,  I have B ,I have C 
('I have A,  I have B ,I have C', 3)

四、一些注意点

1、re.match与re.search与re.findall的区别:

  • re.match:只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;
  • re.search:匹配整个字符串,直到找到一个匹配;
import re

a = re.search('[\d]',"abc33").group() 
print(a) 

p = re.match('[\d]',"abc33") print(p) b=re.findall('[\d]',"abc33") 
print(b) 
 
# 执行结果: 
None 
['3', '3']

2、贪婪匹配与非贪婪匹配

import re

a = re.match('<(.*)>', 'title').group()
print(a) 
b = re.match('<(.*?)>', 'title').group() 
print(b) 

# 执行结果: 
title

a = re.findall(r"a(\d+)b",'a3333b') print(a) 
b = re.findall(r"a(\d+?)b",'a3333b') print(b) 

# 执行结果如下: 
['3333']
['3333']
  • 这里需要注意的是如果前后均有限定条件的时候,就不存在什么贪婪模式了,非匹配模式失效。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值