python 正则表达式

1. 匹配10进制数
r'[0-9]'
# []表示随即之一
# -表示范围
#或者
r'[0123456789]'
r'r[un]'
# 能匹配:rua... || rn... 
# 但不能匹配 run...

例子:

>>> import re
>>> a = '12 sf we dsaf'
>>> re.sub(r'[0-9]','i',a)
'ii sf we dsaf'
2. 匹配16进制数据
r'[0-9a-fA-F]'
r'[\dA-Fa-f]'
# \d表示匹配数字
>>> a = '12 sf we dsaf'
>>> re.sub(r'[\da-fA-F]','@',a)
'@@ s@ w@ @s@@'
>>> 
3. 匹配任意非数字
r'[^0-9]'
# ^ 表示否定一个字符类
>>> re.sub(r'[^0-9]','@',a)
'12@@@@@@@@@@@'
>>> 

同理,匹配任意非十六进制的就应该是:

r'[^\da-fA-F]'
>>> re.sub(r'[^\da-fA-F]','&',a)
'12&&f&&e&d&af'
>>> 
4.量词的使用

{m,n} m表示最少匹配次数,n 表示最多匹配次数。
任何表达式中,除非显示指定,否则量词都为1

>>> a = 'feeeel feeel feel fel'
>>> re.sub(r'e{1,3}','@',a)
'f@@l f@l f@l f@l'
>>> 
>>> re.sub(r'e{0,1}','@',a)
'@f@@@@l@ @f@@@l@ @f@@l@ @f@l@'
>>> re.sub(r'e?','@',a)
'@f@@@@l@ @f@@@l@ @f@@l@ @f@l@'
>>> 
# {0,1} 的速记方式是 '?'
# {1,n} 的速记字符是 '+' ,表示至少一次
# {0,n} 的速记字符是 '*' ,表示任意次
# 上诉的n 表示,量词可能取值的最大值,通常最少是 32767
>>> re.sub(r'e*','@',a)
'@f@l@ @f@l@ @f@l@ @f@l@'
>>> re.sub(r'e+','@',a)
'f@l f@l f@l f@l'
>>> 

默认情况下,所有匹配都是贪婪的,会匹配尽可能多的字符。

>>> re.sub(r'e+?','@',a)
'f@@@@l f@@@l f@@l f@l'
>>> 
># '?' 表示非贪婪
>>> a = '1111 1  222221 '
>>> re.sub(r'\d+','@',a)
'@ @  @ '
>>> re.sub(r'\d+?','@',a)
'@@@@ @  @@@@@@ '
>>> 

提醒一下,‘?’ 在这里就有两种意思了 :

  1. 匹配0次或1次
  2. 非贪婪
>>> a = '<img src="http://123" alt="">'
>>> re.sub(r'img[^>]*','@',a)
'<@>'
>>> a = 'f = f.open()'
>>> re.sub(r'[\=]*[\.]','@',a)
'f = f@open()'
>>> 
># '\' 表示转移字符
5. 组与捕获
>>> a = 'airplane aircraft jet '
>>> re.sub(r'(air|jet)','@',a)
'@plane @craft @ '
>>> re.findall(r'(air(plane|craft)|jet)',a)
[('airplane', 'plane'), ('aircraft', 'craft'), ('jet', '')]
>>> re.findall(r'(air(?:plane|craft)|jet)',a)
['airplane', 'aircraft', 'jet']
>>> re.findall(r'aircraft|airplane|jet',a)
['airplane', 'aircraft', 'jet']
>>> 

解释: | 表示或者的意思。
()一表组合,二表捕获,结果返回一个list。

r'(air(plane|craft)|jet)'
r'(air(?:plane|craft)|jet)'
r'aircraft|airplane|jet'

通过上面的结果看到,有差别!
() 中的东西会捕获,但是在括号的后面加 ?:,意思是不要匹配这个括号的内容。

() 适用于要求有返回值的,想捕捉到数据的**
上面的匹配表达式,2,3等价

>>> a = ' music = 123'
>>> re.findall(r'(\w+) = (.+)',a)
[('music', '123')]
>>> re.findall(r'(\w+).=.(.+)',a)
[('music', '123')]
>>> re.findall(r'(\w+)=(.+)',a)
[]
>>> 

经过这些学习,相信键值的匹配已经学会啦

r'(\w+) = (.+)'
r'(\w+).=.(.+)'
r'(\w+)=(.+)'
# \w 表示任意字母
# + 表示匹配至少一次
# () 表示捕捉
# . 表示任意字符

这种表达式,以及结果都能轻松理解了

6. 表示命名的
>>> a = 'inuyasha = 111'
>>> b =  re.findall(r'(?P<key>\w+) = (?P<value>.+)',a)
>>> b
[('inuyasha', '111')]
r'(?P<key>\w+) = (?P<value>.+)'
# 表示有两次捕捉,一次叫'key',一次叫'value'
7. 断言与标记

‘\b’ 是一种word边界,要求在其前面的字符必须是一个单词(\w),跟随其后的字符必须是一个非单词(\W),或者反过来

>>> a = 'the jet and the jetall'
>>> re.findall(r'\bjet\b',a)
['jet']
>>> re.findall(r'jet',a)
['jet', 'jet']
>>> 

注意r’jet’ 表达式可以匹配两次,但是r’\bjet\b’ 就只能匹配一次。
^ : 匹配字符串开头
$ : 匹配字符串结尾

请注意:需要转移的才能使用的特殊字符:($()*+.[]?^{},|)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值