Python(re模块,正则)

时间:2021-06-10 22:37:59

 day18

正则表达式用处?

匹配 字符串

 1 s = 'hello world'
 2 
 3 print(s.find('llo'))#第一个的位置
 4 
 5 ret = s.replace('ll','xx')
 6 print(ret)
 7 
 8 print(s.split(' '))

执行结果

2
hexxo world
['hello', 'world']

Process finished with exit code 0

以上字符串提供的是完全匹配 模糊匹配,以上方法不可行,需正则表达式
 1 import re
 2 
 3 ret = re.findall('w\w{2}l','hello world')
 4 print(ret)
 5 
 6 ret1 = re.findall('alex', 'aalexsbvesalexfwfawea')#完全匹配,但是没必要
 7 print(ret1)
 8 print(' ')
 9 #元字符
10 
11 # . 代指所有符号,除换行符\n  通配符 .
12 reta = re.findall('w..l', r'hello w  ld') #只能代指任意一个字符
13 print(reta)
14 print(' ')
15 # ^
16 retb = re.findall('^h...o', 'hjasdadsdhello') #只在开始匹配,尽管后面有hello
17 print(retb)
18 print(' ')
19 # $
20 retc = re.findall('a..x$','asfsacsxjaoox') #只在最后匹配
21 print(retc)
22 print(' ')
23 # * 重复匹配
24 retd = re.findall('al.*i', 'sanvjalexli')  #[0,+oo] 匹配0到多次
25 print(retd)
26 print(' ')
27 # + 重复匹配
28 rete = re.findall('ab+', 'sanvjah')  #[1,+oo] 匹配1到多次,a后面必须接上b
29 print(rete)
30 print(' ')
31 # ? [0,1]
32 retf = re.findall('a?b', 'aaabhghabfb') #0个或者1个a,后面接b
33 print(retf)
34 print(' ')
35 # {}
36 retg = re.findall('a{5}b', 'vaaaaaab') #5个a
37 print(retg)
38 reth = re.findall('a{1,3}b', 'vaab') #贪婪匹配,设定一个范围,按最多的取
39 print(reth)

执行结果

['worl']
['alex', 'alex']
 
['w  l']
 
[]
 
['aoox']
 
['alexli']
 
[]
 
['ab', 'ab', 'b']
 
['aaaaab']
['aab']

Process finished with exit code 0

 

结论:*等于{0,正无穷} +等于{1,正无穷} ?等于{0,1}

 1 # 字符集
 2 reta = re.findall('a[c,d]x', 'adx')
 3 print(reta)
 4 
 5 retb = re.findall('[a-z]', 'adx') # a到z都可以匹配
 6 print(retb)#['a', 'd', 'x']
 7 
 8 # [] 取消元字符的特殊功能, 但是\ ^ - 例外
 9 retc = re.findall('[w,*]', 'wad*') # *为一个普通字符
10 print(retc)
11 
12 #但是\ ^ - 例外
13 retd = re.findall('[1-9,a-z,A-Z]', '12sfsA') # *为一个普通字符
14 print(retd)
15 
16 #  ^放在[]中意味着去反
17 rete = re.findall('[^s,A]', '12sfsA') # 除了s和A
18 print(rete)
19 
20 
21 #  \
22 # 反斜杠后面跟元字符去除特殊功能
23 # 反斜杠后面跟普通字符实现特殊功能
24 
25 print(re.findall('\d{11}', 'scbdhsh3123124326543')) # \d数字[0-9]
26 
27 print(re.findall('\sasd', 'fak asd')) # \s匹配任何空白字符
28 
29 print(re.findall('\w', 'scbhsh 12432'))# \w字母数字 ,相当于a-zA-Z0-9
30 
31 print(re.findall(r'I\b', 'hello, I am LI$T'))# \b匹配一个特殊字符的边界
32 
33 
34 #匹配出第一个满足的结果
35 retf = re.search('sb', 'scbdsbhshsb')# 对象
36 print(retf) #<_sre.SRE_Match object; span=(4, 6), match='sb'>
37 print(retf.group())
38 
39 
40 retg = re.search('a\.g', 'a.gj').group()# 此时的点并不是通配符,只是一个 .
41 print(retg)

执行结果:

['adx']
['a', 'd', 'x']
['w', '*']
['1', '2', 's', 'f', 's', 'A']
['1', '2', 'f']
['31231243265']
[' asd']
['s', 'c', 'b', 'h', 's', 'h', '1', '2', '4', '3', '2']
['I', 'I']
<_sre.SRE_Match object; span=(4, 6), match='sb'>
sb
a.g

Process finished with exit code 0

 

()

 1 import re
 2 ret = re.findall(r'\\d', 'abc\de')# r 代表原生字符串,将\\d传给re,而非python解释器
 3 print(ret)
 4 
 5 m = re.search(r'\bblow', 'blow')
 6 print(m)
 7 
 8 print(re.search('(as)+', 'adcdasasas').group())#asas   as为一个整体,匹配多个as
 9 
10 print(re.search('(as)|3', 'as3').group()) #

执行结果

['\\d']
<_sre.SRE_Match object; span=(0, 4), match='blow'>
asasas
as

Process finished with exit code 0

 

1 import re 2 ret = re.findall("www.(\w+).com", "www.baidu.com") #() 组的概念 3 print(ret)

执行结果:

['baidu'] Process finished with exit code 0

 

正则表达式的方法:

1.findall():所有结果都返回一个列表

2.search():返回匹配到的一个对象,对象可调用group()返回结果

3.match():只在字符串开始进行匹配

 

 1 import re
 2 eta = re.match('asd', 'fhdsasd')#只在字符串开始进行匹配
 3 print(reta)
 4 
 5 retb = re.split('[j,s]', 'sdjksal')# 注意空字符
 6 print(retb)
 7 
 8 retc = re.sub('a..x', 's.....b', 'ffghalexbn') # 替换
 9 print(retc)
10 
11 retd = re.compile('\.com')#规则被编译到对象, 点.不再是通配符
12 rete = retd.findall('adcdscd.com')#对象中已经有规则
13 print(rete)

执行结果:

None
['', 'd', 'k', 'al']
ffghs.....bbn
['.com']

Process finished with exit code 0

 

参考:

http://www.cnblogs.com/yuanchenqi/articles/5732581.html