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)
'@@@@ @ @@@@@@ '
>>>
提醒一下,‘?’ 在这里就有两种意思了 :
- 匹配0次或1次
- 非贪婪
>>> 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’ 就只能匹配一次。
^ : 匹配字符串开头
$ : 匹配字符串结尾