python正则表达式基本实现

1、首先要导入python的re模块。

2、元字符 . ^ $ * + ? {} [] \ | ()

re模块中的findall(str1,str2)方法返回字串str2中匹配str1格式的字串。例如在字符串'dit dot det,dct dit dot'中匹配'dit'结果为:

?
1
2
str1 = 'dit dot det,dct dit dot'
print re.findall( 'dit' ,str1)

结果:

?
1
[ 'dit' , 'dit' ]

|作用:'dit|dct'表示dit或者dct。

?
1
2
str1 = 'dit dot det,dct dit dot'
print re.findall( 'dit|dct' ,str1)

结果:

?
1
[ 'dit' , 'dct' , 'dit' ]

[]作用:[ic]表示i或c,例如'd[ic]t'表示dit和dct两者,和'dit|dct'等价:

?
1
2
str1 = 'dit dot det,dct dit dot'
print re.findall( 'd[ic]t' ,str1)

结果:

?
1
[ 'dit' , 'dct' , 'dit' ]

^作用一:[^ic]中^表示否定,即除了i和c:

?
1
2
str1 = 'dit dot det,dct dit dot'
print re.findall( 'd[^ic]t' ,str1)

结果:

?
1
[ 'dot' , 'det' , 'dot' ]

^作用二:^dit表示子串dit在开头位置,而dct不是在开头:

?
1
2
3
str1 = 'dit dot det,dct dit dot'
print re.findall( '^dit' ,str1)
print re.findall( '^dct' ,str1)

结果:

?
1
[ 'dit' ][]

$作用:dot$表示子串dot要在末尾位置,而dct不是在末尾:

?
1
2
3
str1 = 'dit dot det,dct dit dot'
print re.findall( 'dot$' ,str1)
print re.findall( 'dct$' ,str1)

结果:

?
1
[ 'dot' ][]

.作用:d.t表示d与t之间省略了一个任意字符:

?
1
2
str1 = 'dit dot det,dct dit dot'
print re.findall( 'd.t' ,str1)

结果:

?
1
[ 'dit' , 'dot' , 'det' , 'dct' , 'dit' , 'dot' ]

+作用:di+t表示d与t之间省略了一个或多个'i':

?
1
2
str1 = 'd dt dit diit det'
print re.findall( 'd.+t' ,str1)

结果:

?
1
[ 'dit' , 'diit' ]

*作用:di*t表示d与t之间省略了零个至多个'i':

?
1
2
str1 = 'd dt dit diit det'
print re.findall( 'd.*t' ,str1)

结果:

?
1
[ 'dt' , 'dit' , 'diit' ]

经常,'.'和'+'或者'*'搭配使用。'.+'表示省略了一个至多个任意元素,'.*'表示省略了零个至多个任意元素:

?
1
2
3
str1 = 'd dt dit diit det'
print re.findall( 'd.+t' ,str1)
print re.findall( 'd.*t' ,str1)

结果:

?
1
[ 'd dt dit diit det' ][ 'd dt dit diit det' ]

?作用一:看.+的匹配结果,'dit'、'dot'也满足'd.+t'的匹配条件,而输出的却是满足匹配条件的最长子串'dit dot det,dct dit dot',这个叫贪婪匹配。如果要输出最短的匹配字串,只需在'+'后面加上'?':(注:对于'*'也是一样,只需在'*'后面加上'?')

?
1
2
str1 = 'd dt dit diit det'
print re.findall( 'd.+?t' ,str1)

结果:

?
1
[ 'dit' , 'dot' , 'det' , 'dct' , 'dit' , 'dot' ]

?作用二:di?t表示i可有可无,即dt、dit都满足匹配条件:

?
1
2
str1 = 'd dt dit diit det'
print re.findall( 'di?t' ,str1)

结果:

?
1
[ 'dt' , 'dit' ]

{}作用一:di{n}t表示d和t之间有n个'i':

?
1
2
str1 = 'dt dit diit diiit diiiit'
print re.findall( 'di{2}t' ,str1)

结果:

?
1
[ 'diit' ]

{}作用二:di{n,m}t表示d和t之间有n到m个'i':

?
1
2
str1 = 'dt dit diit diiit diiiit'
print re.findall( 'di{1,3}t' ,str1)

结果:

?
1
[ 'dit' , 'diit' , 'diiit' ]

其中,n和m都是可以省略的。{n,}表示n个到任意个;{,m}表示0个到m个;{,}表示任意个,和'*'功能一样:

?
1
2
3
4
str1 = 'dt dit diit diiit diiiit'
print re.findall( 'di{1,}t' ,str1)
print re.findall( 'di{,3}t' ,str1)
print re.findall( 'di{,}t' ,str1)

结果:

?
1
2
3
[ 'dit' , 'diit' , 'diiit' , 'diiiit' ]
    [ 'dt' , 'dit' , 'diit' , 'diiit' ]
    [ 'dt' , 'dit' , 'diit' , 'diiit' , 'diiiit' ]

\作用一:取消元字符,变成转义字符:

?
1
2
3
str1 = '^abc ^abc'
print re.findall( '^abc' ,str1)
print re.findall( '\^abc' ,str1)

结果:

?
1
[][ '^abc' , '^abc' ]

\作用二:预定义字符

?
1
2
3
str1 = '12 abc 345 efgh'
print re.findall( '\d+' ,str1)
print re.findall( '\w+' ,str1)

结果:

?
1
2
[ '12' , '345' ]
    [ '12' , 'abc' , '345' , 'efgh' ]

()作用:在匹配字符串后,只输出匹配字串'()'里面的内容:

?
1
2
3
4
str1 = '12abcd34'
print re.findall( '12abcd34' ,str1)
print re.findall( '1(2a)bcd34' ,str1)
print re.findall( '1(2a)bc(d3)4' ,str1)

结果:

?
1
2
3
[ '12abcd34' ]
    [ '2a' ]
    [( '2a' , 'd3' )]

3、re模块里的主要方法:findall()、finditer()、match()、search()、compile()、split()、sub()、subn()。

re.findall(pattern,string,flags = 0)

作用:在string中从左往右搜索与pattern匹配的字串,结果以list形式返回。

?
1
2
str1 = 'ab cd'
print re.findall( '\w+' ,str1)

结果:['ab', 'cd']

re.finditer(pattern,string,flags = 0)

作用:其功能与re.findall相同,但结果以迭代器的形式返回。

?
1
2
3
4
str1 = 'ab cd'
iter1 = re.finditer( '\w+' ,str1)
for a in iter1:
   print a.group(),a.span()

结果:

ab (0, 2)
      cd (3, 5)

(注:a.group()返回满足匹配调节的字串,a.span()返回字串的起始位置和末尾位置)

re.search(pattern,string,flags = 0)

作用:在string中从左往右搜索与pattern匹配的字串,无匹配结果则返回None,否则返回一个search实例。

?
1
2
3
4
5
6
str1 = 'ab cd'
result = re.search( 'cd' ,str1)
if result = = None :
   print 'None'
else :
   print result.group(),result.start(),result.end()

结果:cd 3 5

re.match(pattern,string,flags = 0)

作用:判断string的头部是否与pattern匹配,是则返回match实例,否则返回None。

?
1
2
3
4
5
6
str1 = 'ab cd'
result = re.match( 'cd' ,str1)
if result = = None :
   print 'None'
else :
   print result.group(),result.start(),result.end()

结果:None

re.compile(pattern,flags = 0)

作用:对匹配格式pattern进行编译,返回一个实例对象。对正则表达式先编译,可以大幅提高匹配速度。

?
1
2
3
str1 = 'ab cd'
pre = re. compile ( 'ab' )
print pre.findall(str1)

结果:['ab']

re.split(pattern,string,maxsplit = 0,flags = 0)

作用:在string匹配pattern的时候做分割:

?
1
2
3
4
str1 = 'ab.c.de'
str2 = '12+34-56*78/90'
print re.split( '\.' ,str1)
print re.split( '[\+\-\*/]' ,str2)

结果:

['ab', 'c', 'de']
      ['12', '34', '56', '78', '90']

re.sub(pattern,repl,string,count = 0,flags = 0)

作用:在string当中把满足pattern正则的字串替换成repl:

?
1
2
str1 = 'abcde'
print re.sub( 'bc' , '123' ,str1)

结果:a123de

re.subn(pattern,repl,string,count = 0,flags = 0)

作用:其功能与re.sub()相同,但返回的结果多了一个数字,代表替换了多少次

?
1
2
str1 = 'abcdebce'
print re.subn( 'bc' , '123' ,str1)

结果:('a123de123e', 2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值