正则表达式是python程序猿经常考察的一个地方,其应用也比较广泛,主要功能是定义格式去匹配查找给定的字符串内容,找出符合我们要求的字符串内容;re模块就是正则模块,其提供了所有的正则表达式功能;
正则里面的特殊字符类:
\d | 匹配一个数字字符。等价于 [0-9]。 |
\D | 匹配一个非数字字符。等价于 [^0-9]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\w | 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 |
\W | 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 |
正则表达式经常用到的元字符: . ^ $ * + ? {} [] \ | () 下面举例介绍他们的用法
import re
s='abc'
s=r'abc'
re.findall(s,"aaaaaaaaa")
Out[5]: []
re.findall(s,"abcaaaaaaaaaaaaaabc")
Out[6]: ['abc', 'abc']
st="top tip tap tqp tep"
res=r"top"
re.findall(res,st)
Out[9]: ['top']
res=r"tip"
re.findall(res,st)
Out[11]: ['tip']
res=r"t[io]p"
re.findall(res,st)
Out[13]: ['top', 'tip']
res=r"t[^io]p" # 非的意思 除此之外
re.findall(res,st)
Out[15]: ['tap', 'tqp', 'tep']
s="hello world,hello boy"
r=r"hello"
re.findall(r,s)
Out[18]: ['hello', 'hello']
r=r"^hello"
re.findall(r,s) # ^ 代表匹配行首
Out[20]: ['hello']
s="world,hello boy"
re.findall(r,s) # ^ 代表匹配行首
Out[22]: []
r=r"boy$" # $匹配行尾
re.findall(r,s)
Out[24]: ['boy']
r=r"t[abc$]"
re.findall(r,'ta')
Out[26]: ['ta']
re.findall(r,'tb')
Out[27]: ['tb']
re.findall(r,'tc')
Out[28]: ['tc']
re.findall(r,'t$')
Out[29]: ['t$']
re.findall(r,'tax')
Out[30]: ['ta']
r=r"t[abc^]"
re.findall(r,'t^')
Out[32]: ['t^']
r=r"x[0-9]x"
re.findall(r,'x1x x2x x9x')
Out[34]: ['x1x', 'x2x', 'x9x']
r=r"x[a-zA-Z0-9]x" # 大小写字母与数字
r=r"\^abc"
re.findall(r,"^abc ^abc ^abc")
Out[37]: ['^abc', '^abc', '^abc']
r=r"\d" # 所有的数字
re.findall(r,'123456')
Out[39]: ['1', '2', '3', '4', '5', '6']
# \w 表示大小写字母和数字 【a-zA-Z0-9】
r=r"^010-a{8}" # 重复八次
re.findall(r,'010-87654321')
Out[42]: []
re.findall(r,'010-aaaaaaaa')
Out[43]: ['010-aaaaaaaa']
r=r"^010-\d{8}" # 重复八次
re.findall(r,'010-87654321')
Out[45]: ['010-87654321']
r=r"ab*" # 大于等于0次
re.findall(r,"abbbbbbb")
Out[48]: ['abbbbbbb']
re.findall(r,"a")
Out[49]: ['a']
r=r"ab+" # 大于等于1次
re.findall(r,'abbbbbbbb')
Out[52]: ['abbbbbbbb']
re.findall(r,'a')
Out[53]: []
r=r"^010-?\d{8}$"
re.findall(r,"010-12345678")
Out[55]: ['010-12345678']
re.findall(r,"01012345678")
Out[56]: ['01012345678'] # ?可有可无
r=r"a{1,3}"
re.findall(r,'a')
Out[58]: ['a']
re.findall(r,'aaa')
Out[59]: ['aaa']
re.findall(r,'aaaa')
Out[60]: ['aaa', 'a'] # 最多3次
r1=r"\d{3,4}-?\d{8}"
re.findall(r1,"010-12345678")
Out[62]: ['010-12345678']
p_tel=re.compile(r1) # 编译之后使用方便
p_tel.findall('010-12345678')
Out[64]: ['010-12345678']
p_tel.findall('010-123456789')
Out[65]: ['010-12345678']
csvt_re=re.compile(r'csvt',re.I) # 不管大小写
csvt_re.findall("CSVT")
Out[67]: ['CSVT']
csvt_re.findall("CSsT")
Out[68]: []
csvt_re.findall("CSvT")
Out[69]: ['CSvT']
csvt_re.match('csvt hello') # 匹配开头
Out[70]: <_sre.SRE_Match at 0x3b63648>
csvt_re.match('hello')
csvt_re.match('hello csvt')
csvt_re.search('hello csvt') # 全部扫描
Out[73]: <_sre.SRE_Match at 0x3b637e8>
csvt_re.search('hello hello')
csvt_re.findall('hello csvt hello csvt csvt')
Out[75]: ['csvt', 'csvt', 'csvt']
csvt_re.finditer('hello csvt hello csvt csvt') # 返回一个对象
Out[76]: <callable-iterator at 0x3b47908>
x=csvt_re.finditer('hello csvt hello csvt csvt')
x
Out[78]: <callable-iterator at 0x3b47f28>
x.next()
Out[79]: <_sre.SRE_Match at 0x3b63bf8>
x=csvt_re.match('hello csvt') # 使用match如何看到那个结果
x=csvt_re.match('csvt hello')
x
Out[82]: <_sre.SRE_Match at 0x3b63ed0>
x.group() # 查看match的结果
Out[83]: 'csvt'
# match 匹配开头
s="hello csvt"
s.replace('csvt','python') # 替代
Out[86]: 'hello python'
rs=r"c..t"
re.sub(rs,'python','csft ckst clot cccc')
Out[88]: 'python python python cccc'
re.split(r'[\+\-\*]',"123+456-789*000")
Out[89]: ['123', '456', '789', '000']
r1=r"csvt.net"
re.findall(r1,'csvt.net')
Out[91]: ['csvt.net']
re.findall(r1,'csvtonet')
Out[92]: ['csvtonet']
re.findall(r1,'csvt\nnet',re.S)
Out[93]: ['csvt\nnet']
re.findall(r1,'csvt\tnet',re.S) # 特殊字符
Out[94]: ['csvt\tnet']
s="""
hello csvt
csvt hello
hello csvt hello
csvt hehe
"""
r2=r"^csvt"
re.findall(r2,s)
Out[97]: []
s
Out[98]: '\nhello csvt\ncsvt hello\nhello csvt hello\ncsvt hehe\n'
re.findall(r2,s,re.M) # 多行数据要加 M
Out[99]: ['csvt', 'csvt']
tel=r"""
\d{3,4}
-?
\d{8}
"""
re.findall(tel,'010-12345678',re.X) # 多行正则要加 X
Out[101]: ['010-12345678']
email=r"\w{3}@\w+(\.com|\.cn)" # 邮件匹配正则 很好!
re.match(email,'zzz@gmail.com')
Out[103]: <_sre.SRE_Match at 0x3a52dc8>
s="""
lsddk lsdjf hello src=jj yes lsdj
lsdj src=123 yes jdf
src=45 yes
hello src=089 yes lj
"""
r3=r"hello src=.+ yes"
re.findall(r3,s)
Out[106]: ['hello src=jj yes', 'hello src=089 yes']
r3=r"hello src=(.+) yes" # 把感兴趣的值提取出来
re.findall(r3,s)
Out[108]: ['jj', '089']
match
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
print(re.match('www','www.runoob.com').span())
print(re.match('com','www.runoob.com'))
run C:\Anaconda\zz.py
(0, 3)
None
#!/usr/bin/python import re line = "Cats are smarter than dogs" matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) # 多行 不区分大小写 if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2) else: print "No match!!"
以上实例执行结果如下:
matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats # 不算 are? matchObj.group(2) : smartersearch 的用法
#!/usr/bin/python # -*- coding: UTF-8 -*- import re print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配 print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
以上实例运行输出结果为:
(0, 3) (11, 14)