python3 正则表达式 re模块

正则表达式:是一种小型的、高度专业化的编程语言,它内嵌在python中,并通过re模块实现。正则表达式模式被编译成一些列的字节码,然后用C编写的匹配引擎执行。

用来匹配字符串

 

普通字符和元字符:

元字符:

.    通配符 ,代指所有的字符(除了换行符),一个点表示一个字符

>>> import re
>>> re.findall('w\w{2}l','hello world')
['worl']
>>> re.findall('w..l','hello world')
['worl']
>>> re.findall('w.l','hello world')
[]

 

^  对字符串的开始进行匹配

 

>>> re.findall('^h...o','hjkjlkjjkhello')
[]
>>> re.findall('h...o','hjkjlkjjkhello')
['hello']

 

$  匹配末尾的字符串

 

>>> re.findall('a..d$','hkekjannd')
['annd']
>>> re.findall('a..d$','hkekjanndy')
[]

 

*  重复匹配,重复前面一个字符多次匹配,可以是0次

 

>>> re.findall('a.*li','gjkjalexlifjjl')
['alexli']
>>> re.findall('sak*jl','gkskkkkkkkkjljkljl')
[]
>>> re.findall('sak*j','gkskkkkkkkkjljkljl')
[]
>>> re.findall('sk*j','gkskkkkkkkkjljkljl')
['skkkkkkkkj']

 

+ 重复匹配,重复前面一个字符多次匹配,从1开始匹配,最少就有一个字符

 

>>> re.findall('sk+j','gkskkkkkkkkjljkljl')
['skkkkkkkkj']
>>> re.findall('a+b','bbbaabx')
['aab']
>>> re.findall('a+b','bbbaabxaaabm')
['aab', 'aaab']

 

?重复匹配,匹配前面一个字符,只能是[0,1],  0次或者1次

 

>>> re.findall('a?b','bbbaabx')
['b', 'b', 'b', 'ab']
>>> re.findall('a?b','baabx')
['b', 'ab']

 

{} 重复匹配,自定义匹配次数,次数可以是一个范围 按最多的次数进行匹配(默认为贪婪匹配)

 

>>> re.findall('a{2}b','abb')
[]
>>> re.findall('a{2}b','aabbx')
['aab']
>>> re.findall('a{2}b','aaabbx')
['aab']
>>> re.findall('a{2}b','aaaabbx')
['aab']
>>> re.findall('a{1,3}b','aaaabbx')
['aaab']
>>>
>>> re.findall('a{1,3}b','aaaabbx')
['aaab']
>>>
>>> re.findall('a{2,3}b','abbx')
[]

小结:

*  等价于 {0,+∞}

+ 等价于 {1,+∞}

?等价于 {0,1}

 

>>> re.findall('abc*?','abcccc')  #惰性匹配匹配最小值0  * 0-∞
['ab']
>>> re.findall('abc+?','abcccc') #惰性匹配 匹配最小值1  + 1-∞
['abc']

 

 

 

 

 

[ ] 字符集,取消元字符的特殊功能,将元字符写在中括号,但是( \ ^ - 例外)

>>> import re
>>> re.findall('a[c,d]x','acx')
['acx']
>>> re.findall('a[c,d]x','adx')
['adx']
>>> re.findall('a[c,d]x','acdx')
[]
>>> re.findall('a[c,d,r]x','arx')
['arx']
>>> re.findall('a[c,d,r]x','ar x')
[]
>>> re.findall('a[c,d,r, ]x','ar x')
[]
>>> re.findall('a[c,d,r, ]x','a x')
['a x']
>>>
>>> re.findall('[a-z]','a x')
['a', 'x']
>>> re.findall('v[a-z]i','vaoxi')
[]
>>> re.findall('v[a-z]i','vxi')
['vxi']
>>> re.findall('v[w,*]i','v*i')
['v*i']
>>> re.findall('v[w,*]i','vni')
[]
>>> re.findall('v[w,*]i','vwi')
['vwi']
>>> re.findall('[w,*,,]','vwi,')
['w', ',']
>>> re.findall('[1-9,a-z,A-Z]','13tyQW')
['1', '3', 't', 'y', 'Q', 'W']
>>> re.findall('1-9a-zA-z','13tyQW')
[]
>>> re.findall('[1-9a-zA-z]','13tyQW')
['1', '3', 't', 'y', 'Q', 'W']

 

[ ^ ] 中括号中^取反匹配

 

>>> re.findall('[^ty]','13tyQW')
['1', '3', 'Q', 'W']
>>> re.findall('[^1ty]','13tyQW')
['3', 'Q', 'W']
>>> re.findall('[^t,y]','13tyQW')
['1', '3', 'Q', 'W']

 

\   反斜杠后跟元字符去除特殊功能,反斜杠后跟普通字符实现特殊功能

 

\d 匹配任何十进制数字, [0-9]

\D 匹配任何非数字字符, [^0-9]

>>> import re
>>> re.findall('\d{3}','qq23490208')
['234', '902']
>>> re.findall('\D','qq23490208')
['q', 'q']

\s 匹配任何空白字符,[\t\n\r\f\v]

\S 匹配任何非空白字符, [^\t\n\r\f\v]

>>> re.findall('\s{2}','qq23490208')
[]
>>> re.findall('\s{2}','qq 2 3 490208')
[]
>>> re.findall('\s','qq 2 3 490208')
[' ', ' ', ' ']
>>> re.findall('\S','qq 2 3 490208')
['q', 'q', '2', '3', '4', '9', '0', '2', '0', '8']
>>> re.findall('\S2','qq 2 3 490208')
['02']
>>> re.findall('\S4','qq 2 3 490208')
[]
>>> re.findall('\s2','qq 2 3 490208')
[' 2']
>>> re.findall('\s4','qq 2 3 490208')
[' 4']

 

\w 匹配任何字母数字字符,[a-zA-Z0-9]

 

\W 匹配任何非字母数字字符,[^a-zA-Z0-9]

>>> re.findall('\w','qq 2 3 490208')
['q', 'q', '2', '3', '4', '9', '0', '2', '0', '8']
>>> re.findall('\W','qq 2 3 490208')
[' ', ' ', ' ']

 

\b 匹配一个特殊字符边界,指单词和空格间或者特殊字符的位置边界

 

>>> re.findall(r'I\b','I am Ice')
['I']
>>> re.findall(r'I\b','I am I$e')
['I', 'I']
>>> re.findall(r'\bI','hello,I am uI$e')
['I']
>>> re.findall(r'\bI','hello,I am I$e')
['I', 'I']

 

re.search(), 匹配出找到的第一个结果用 group() 匹配结果值

>>> import re
>>> re.search('a..c','xxaauocl')
<_sre.SRE_Match object; span=(3, 7), match='auoc'>
>>> ret = re.search('a..c','xxaauocl')
>>> ret.group() #返回匹配的值
'auoc'

()正则表达式 进行分组匹配的字符

>>> re.search('(as)+','asdjkaskkoas').group()  #(as)为一个整体进行匹配
'as'
>>> re.search('(as)|3','asdjkaskkoas').group() #| 管道符  为或者的意思
'as'
>>> re.search('(as)|3','asdjkaskkoas3').group() # 匹配到第一个
'as'
>>> re.search('(as)|3','3asdjkaskkoa').group()
'3'

 

>>> import re
>>> ret = re.search('(?P<id>\d{3})','weeew34ttt123/ooo') #分组匹配 用括号括起来,其中?P<id>为固定格式该组匹配的字符内容,可用group(’id‘)获取其该分组匹配值结果
>>> ret.group()
'123'
>>> ret = re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew34ttt123/ooo') #两个分组匹配id组和name组
>>> ret.group()
'123/ooo'
>>> ret.group('id')  #id分组匹配结果值
'123'
>>> ret.group('name') #name分组匹配结果值
'ooo'

正则表达式的方法:

findall() 返回所有的结果,返回为list列表

>>> re.findall('www.(\w+).com','www.baidu.com') #返回括号分组的内容,返回’baidu‘
['baidu']
>>> re.search('www.(\w+).com','www.baidu.com').group() #用search()返回整个匹配的字串
'www.baidu.com'
>>> re.findall('www.(?:\w+).com','www.baidu.com') #findall() 组里面用?:方式取消组的优先级后返回整个字串
['www.baidu.com']

finditer()方法,生成迭代器,使用next方法获取匹配值

>>> ret = re.finditer('\d','q1w2e3r4t5y') #迭代器
>>> print(ret)
<callable_iterator object at 0x00000265533B1668>
>>> next(ret)
<_sre.SRE_Match object; span=(1, 2), match='1'>
>>> next(ret).group() #获取匹配值
'2'

 

search() 返回一个对象,仅匹配第一个对象,使用group()方法获取返回结果

 

match() 只在字符串开始匹配,使用group() 方法获取返回结果

>>> ret = re.match('asd',"asd45ooolasde")
>>> ret.group()
'asd'

 

split() 以某个字符进行分割字符串

>>> import re
>>> re.split('[k,s]','djksal')
['dj', '', 'al']  #出现空格
>>> re.split('[ks]','djksal') #先以k进行分割后,再将分割后的字符串以s进行分割
['dj', '', 'al']
>>> re.split('[ks]','djkskasl') #先以k进行分割后,再将分割后的字符串以s进行分割
['dj', '', '', 'a', 'l']

 

 

sub()  替换功能,至少三个参数

 

 

>>> re.sub('a..x','s..b','hfjasalexxdhf')
'hfjass..bxdhf'
>>> import re
>>> re.sub('\d','A','q1w2e3r4t4y',1) #参数依次为: 要被匹配的字串内容, 替换为的字串,需要操作替换的整个字串,多个匹配替换的个数
'qAw2e3r4t4y'
>>> re.sub('\d','A','q1w2e3r4t4y',2)
'qAwAe3r4t4y'
>>> re.sub('\d','A','q1w2e3r4t4y',4)
'qAwAeArAt4y'
>>> re.sub('\d','A','q1w2e3r4t4y') #无替换个数参数直接全部替换
'qAwAeArAtAy'

 

 

 

compile() 创建匹配字符串对象

 

 

 

>>> obj = re.compile('\.com')
>>> obj.findall('fajfskjk.comfsdds')  #直接对象使用方法
['.com']

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值