2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > python中的re模块和正则表达式基础

python中的re模块和正则表达式基础

时间:2024-06-04 22:32:35

相关推荐

python中的re模块和正则表达式基础

1.正则匹配基础知识

(1)通配符.

.只匹配一个字符

>>> re.findall("p.ckname","piiickname-pockname")['pockname']

如果要匹配.等特殊字符,要使用注意字符\

>>> re.findall("p.ckname","pickname--p.ckname")['pickname', 'p.ckname']>>> re.findall("p\.ckname","pickname--p.ckname")['p.ckname']

(2)字符集[],只能匹配单个字符,匹配多个见(4)

[a-z] 可以匹配a-z之间任意一个字符

[a-zA-Z0-9]匹配a-z,A-Z,0-9的任意一个字符

[^p]反转匹配,可以匹配除了p的一个字符串,注意是使用[ ]括起来的,和(5)区分出来

#例子

>>> re.findall("p[a-z]ckname","piickname-pockname")['pockname']>>> re.findall("p[a-z]*ckname","piickname-pockname")['piickname', 'pockname']

>>> re.findall("p[^o]ckname","pickname-pockname")

['pickname'] @反转匹配

(3)选择符 | 相当于或

>>> re.findall("name|test","pickname-testpy")

['name', 'test']

(4)可选项,注意()的使用

()?子模式出现0次或者1次

()*子模式出现0次或者多次

()+子模式出现1次或者多次

(){m,n}子模式出现m-n次

在这个模式下注意一下findall和search的结果

>>> aa=re.search("(name){2}","myname--mynamename--my")>>> print aa.group()namename>>> re.findall("my(name){2}","myname--mynamename--my")['name'] 这里匹配不到namename,需要进一步理解re的几个函数区别

举个例子r'(http://)?(www\.)?baidu\.com'

匹配结果:

(5)开头和结尾

^只想在字符串的开头匹配http ^http

$只想在字符串的结尾匹配http http$

这里要区分下不以http开头的string怎么写呢?

[^http]要写在[ ]里面

2.re模块

pile()

可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。

text="hello,meixiaoer!"

pa=pile('h')

pa.match(text)

pa.findall(text)

pa.search(text)

结果:<_sre.SRE_Match object at 0x01ADF100>

['h']

<_sre.SRE_Match object at 0x01A6EDE8>

re.match()

尝试从字符串的开始匹配一个模式,只匹配一个!

re.match('h',text) 结果是<_sre.SRE_Match object at 0x01ADF090>

re.match('e',text) 结果是none

要是想打印出匹配字符可以这样

m=re.match('h',text)

print m.group(0) 结果是h

re.search()只匹配一个!

函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回,未匹配返回none

>>> re.search('e',text)

<_sre.SRE_Match object at 0x01ADF100>

打印元素

>>> m=re.search('e',text)

>>> print m.group(0)

e

因为只匹配第一个元素,所以第二个元素会报错

>>> m=re.search('e',text)

>>> print m.group()

IndexError: no such group

re.findall()查找多有符合的元素,匹配所有,返回列表

>>> re.findall("name","name-myname-yourname")['name', 'name', 'name']>>> re.findall("^name","name-myname-yourname")['name'] 因为^name正则表达式是从开始匹配的,可以理解下

另一个例子更清楚的看清三个函数的区别

#只有findall可以查找所有的f=re.findall('[0-9]','2fff4')print f #['2','4'] 返回结果是列表 s=re.serach('[0-9]','fff45')//查找第一个符合的以后就停止查找了print s.group() #4m=re.match('[0-9]','fff45') //从第一个字符开始匹配,符合以后就停止查询print m.group() #Nonem=re.match('[0-9]','1fff45')print m.group() #1

###########一些常用的使用场景#################

1.

#使用()进行分组#不使用(),表示表达式是一个组,就要使用group(0)m=re.match(r'\d{3}-\d{3,8}','010-12345')print m.group(0) #010-12345,ps特殊符号一遍要使用\-但是-这里不使用也可以#如果使用(),表示表达式是有n个组的,所以要使用groups()m=re.match(r'(\d{3})-(\d{3,8})','010-12345')print m.groups()#('010', '12345')print m.group(0)#010-12345 默认组0,组0包含整个字符串print m.group(1)#010 组1包含第一个()内的正则print m.group(2)#123456组2包含第二个()内的正则

2. 分割字符应用

p=pile(r'd+')p.split('one1two22three333four') #['one', 'two', 'three', 'four']

两种方法,先compile后,就不用每次都运行compile了

ss="hello,what,is,,,,,,your,,name"import resss=re.split('[,]+',ss)print sss#等同于pa=pile('[,]+')aaa=pa.split(ss)print aaa

3替换应用,最突出的就是和组结合使用

re.sub()

4贪婪匹配

将贪婪比配转换成非贪婪模式?,这里注意?的位置啊

ss='*mili*is*great*'#贪婪模式pa=pile(r'\*(.+)\*')print pa.match(ss).group(0)#*mili*is*great* 世界只想匹配*mili*,贪婪尽可能多的东西匹配

#非贪婪模式,匹配到就停止

pa1=pile(r'\*(.+?)\*') #这里注意下?的位置啊(.+)?这个?指的是0次或者1次,不一样的print pa1.match(ss).group(0)#*mili*

5 re.sub替换,模式替换

#替换re.sub强大之处就在于替换中使用组号,默认整个字符创是group(0),\1第一个()group(1)#re.sub(pa,repl,string,count=0) 用repl替换pa匹配的地方print help(re.sub)ss='hello, *world*'pa=pile(r'\*([^\*]+)\*') #匹配不以*开头的字符串,^需要[^]使用print re.sub(pa,'hahahaha',ss)#hello, hahahahapa1=pile(r'\*([^\*]+)\*')print re.sub(pa,r'<h1>\1</h1>',ss)

#\1第一个()group(1)

hello, <h1>world</h1>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。