正则表达式——Python版

本文详细介绍Python中正则表达式的使用方法,包括特殊字符类、元字符的应用及实例演示。通过具体案例讲解如何进行字符串匹配、搜索、替换等操作。

    正则表达式是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) :  smarter
search 的用法
#!/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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值