书接上回:
1. 符号含义
[] | 里面的字符是或的关系,外面的字符是与的关系 例如:re.findall('d[hf]g', str) #查找dhg/dfg |
^ | 非 ; 例如:re.findall('d[^hf]g', str) #查找非dhg/非dfg |
{} | 里面的内容是字符的长度 例如:re.findall('[a-zA-Z]{1,3}', str) #查找英文单词,长度在1-3之间,当长度超过3时会切割,比如PPTWORD就会切割成'PPT'、'WOR'、'D' |
\d | 数字 例如:re.findall('[\d]', str) |
\D | 除数字之外的字符 例如:re.findall('[\D]', str) |
\w | 中文、英文、数字、下划线,不能是特殊字符 |
\W | 特殊字符(包括逗号,*号,小括号,#号,\t,\n,$等) |
\s | 空白字符(包括空格,换行,制表符等) |
\S | 非空白字符 |
* | 匹配0次或无数次 |
+ | 匹配1次或无数次 |
? | 匹配0次或1次 |
. | 匹配任意单个字符,除了换行符 |
.并且加上re.S | 匹配任意单个字符,包括换行符 例如:re.findall('dfg.',any_string,re.S) |
re.I | 忽略大小写 |
2. 几个常用匹配
(1)查找所有数字/部分数字
所有数字:[0-9]或者[\d]
部分数字:[1-3 6 9]
(2)查找除数字以外的字符
[^0-9]或者[\D]
(3)查找固定+随机字符
'd[hf]g' #dhg/dfg
(4)查找所有英文字符
[a-zA-Z]
(5)匹配正整数
^[1-9]\d*
(6)匹配负整数
^-[1-9]\d*
(7)匹配整数
^-?[1-9]\d*
(8)匹配非负整数
^[1-9]\d*|^0
3. 查找字符re.findall
用法:lst = re.findall(正则匹配表达式,要查找的字符串对象)
re.findall返回的是列表
4. 边界匹配
例4
tel = 'a13086618091b7364bds9373747654893ndd03874747637308475'
tel1 = re.findall('\d{11}', tel) #查找连续11个数字
print('19:',tel1) #['13086618091', '93737476548', '03874747637']
tel2 = re.findall('^\d{11}', tel) #从开始位置进行11个数字匹配
print('20:',tel2) #[]
tel3 = re.findall('\d{11}$', tel) #从结尾位置进行11个数字匹配
print('21:',tel3) #['47637308475']
tel4 = re.findall('^\d{11}$', tel) #开始和结尾之间只能有11个数字
print('22:',tel4) #[]
5. 组group
例5:
group = 'abcxyz123abcabcdhg456abcabcxyzabcabcabc'
group1 = re.findall('(abc)',group) # 提取出所有的abc,()里是与的关系,是组
print('23:',group1) #['abc', 'abc', 'abc', 'abc', 'abc', 'abc', 'abc', 'abc']
group11 = re.findall('abc',group)
print('23333:',group11) #['abc', 'abc', 'abc', 'abc', 'abc', 'abc', 'abc', 'abc']
group2 = re.findall('(abc){3}',group) # 提取出连续3个的abc合成1个
print('24:',group2) #['abc']
group3 = re.findall('(abc)(xyz)',group)
print('25:',group3) #[('abc', 'xyz'), ('abc', 'xyz')]
# 分组
group4 = re.search('([a-z]*)([0-9]*)([a-z]*)',group) #任意个数小写字母+任意个数数字+任意个数字母
print('26:',group4.group()) #显示所有组abcxyz123abcabcdhg
print('27:',group4.group(0)) #显示所有组abcxyz123abcabcdhg
print('28:',group4.group(1)) #显示第一组abcxyz
6. 替换字符re.sub
例6
replace = 'ahsa'
replace1 = re.sub('a','A',replace,1) #把a替换成A,替换1次/第四个参数默认是0,表示替换所有
print('30:',replace1) #Ahsa
def function1(parameter):
pass #或return 某些值
replace2 = re.sub('a',function1,replace) #把a替换成函数,函数不返回任何值,所以就是把a消除
print('31:',replace2) #hs
def function2(parameter):
newpara = parameter.group() #group()在正则表达式中用于获取分段截获的字符串
return '$'+ newpara
replace3 = re.sub('a',function2,replace)
print('32:',replace3) #$ahs$a
range = 'gs73649bd28cb73b92b'
def func1(para):
newpara = para.group() #注意:分段获取得到的是字符串
if int(newpara) > 5:
newchar = '9'
else:
newchar = '0'
return newchar
range1 = re.sub('[0-9]',func1,range) #大于5替换成9,小于等于5替换成0
print('33:',range1) #gs90909bd09cb90b90b
7. 匹配字符re.match&re.search
(1)match:匹配第一个字符,如果不匹配,返回none,匹配,返回一个对象,该对象就是匹配的结果
(2)search:从第一个字符开始匹配,如果不匹配,返回none,匹配,返回第一个匹配的对象
例7
match = '7h1o293hbsk'
match1 = re.match('\d',match)
print('34:',match1) #<re.Match object; span=(0, 1), match='7'>
print('35:',match1.group()) #返回结果:7
print('36:',match1.span()) #返回元组:(0,1),匹配位置,(0,1)表示从0位置开始,1位置结束
search1 = re.search('\d',match)
print('37:',search1) #<re.Match object; span=(0, 1), match='7'>
print('38:',search1.group())#7