re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

函数语法

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

参数说明:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

pattern  要匹配的正则表达式
string    要匹配的字符串
flags     标志位,用于控制正则表达式的匹配方式,例如,是否要区分大小写等等,参考正则表达式修饰符

实例

import re
print(re.match('abc','abcdefghi').span())   #在起始位置匹配
print(re.match('ghi','abcdefghi'))          #不在起始位置匹配

运行结果

(0, 3)
None

 re.search方法

re.search 扫描整个字符串并返回第一个成功匹配。

函数语法

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

实例

import re
print(re.search('abc','abcdefghi').span())    #在起始位置匹配
print(re.search('ghi','abcdefghi').span())    #不在起始位置匹配

运行结果

(0, 3)
(6, 9)

re.match与re.search的区别:

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

检索和替换

 Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

语法

re.sub(pattern, repl, string, count=0, flags=0)

参数说明

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

实例

import re
phone_number='3-123-456-789'
#将'-'替换成'@' number=re.sub('-','@',phone_number) print('修改后的电话号码',number)

运行结果

修改后的电话号码  3@123@456@789

repl参数是一个函数时

实例

import re
#将匹配到的数字乘3 def double(a): c=int(a.group('c')) return str(3*c) print(re.sub('(?P<c>\d+)',double,'asd-645-sa-4-da-87-ad-6'))

运行结果

asd-1935-sa-12-da-261-ad-18

compile函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

语法格式为:

re.compile(pattern, [flags])

实例

import re
pattern = re.compile(r'\d+')
a = pattern.match('one12twothree34four',3,10)   #从 1 开始查找
print(f'{a.group(),a.span()}')
b = pattern.search('one12twothree34four', 5, 15)#从 t 开始搜索
print(f'{b.group(),b.span()}')

运行结果

('12', (3, 5))
('34', (13, 15))

findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法格式

findall(pattern, string, flags=0)

实例

import re
reg='\d+'
print(re.findall(reg,'1a2b3c4d5e6f7g'))

运行结果

['1', '2', '3', '4', '5', '6', '7']

split

split 方法按照能够匹配的子串将字符串分割后返回列表

语法格式

re.split(pattern, string, maxsplit, flags)

参数

maxsplite  分割次数,maxsplit=1即分割一次,默认为0,不限制次数

 

实例

import re
Str='1a2b3c4d5e6d7f'
print(re.split('[a-z]',Str))

运行结果

['1', '2', '3', '4', '5', '6', '7', '']

正则表达式对象

re.MatchObject

group() 返回被 RE 匹配的字符串。

  • start() 返回匹配开始的位置
  • end() 返回匹配结束的位置
  • span() 返回一个元组包含匹配 (开始,结束) 的位置

正则表达式修饰符 (flags)

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

 

正则表达式常用字符含义

普通字符 匹配自身
 .  默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符包括换行
 ^  匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
 $  匹配字符结尾或e.search(r"^a","\nabc\neee",flags=re.MULTILINE).group()也可以
 *  匹配*号前的字符0次或多次re.findall("ab*","cabb3abcbbac")  结果为['abb', 'ab', 'a'] 
 +  匹配前一个字符1次或多次re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
 ?  匹配前一个字符1次或0次
 {m}  匹配前一个字符m次
{n,m}   匹配前一个字符n到m次re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb'] 
 |  匹配|左或|右的字符re.search("abc|ABC","ABCBabcCD").group() 结果'ABC' 
 (...)  分组匹配re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
 [...]  字符集,对应位置可以是字符集中的任意字符,字符集中的字符可以逐个给出也可以给出范围,如[a-c]即[abc],[^abc]b表示取反即非abc
\A 只从字符开头匹配re.search("\Aabc","alexabc") 是匹配不到的
\Z 匹配字符结尾同$
\d 匹配数字0-9
\w 匹配[A-Za-z0-9]
\D 匹配非数字
\W 匹配非[A-Za-z0-9]
\s 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果为 '\t'

 

反斜杠作用:

  • 反斜杠后边跟元字符去除特殊功能;(即将特殊字符转义成普通字符)
  • 反斜杠后边跟普通字符实现特殊功能;(即预定义字符)
  • 引用序号对应的字组所匹配的字符串。

 

萌新第一次发博客,坐等大佬点评

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄