Python学习 之 正则表达式

1、简单的正则表达式

import re
s=r'abc'
re.findall(s,"aaaaaaaaaaaaaaa")   #结果为[]
re.findall(s,"abcaaaaaaaaaaaa")    #结果为['abc']
re.findall(s,"abcaaaaaabcaaaa")    #结果为['abc','abc']

2、元字符

[] :指定一个字符集  例如:r't[io]p'  满足的字符串包括'tip'或'top'

  加上^表示取反  例如:r't[^io]p'  满足的字符串包括除'tip'或'top'之外的字符串

^ :匹配行首  r'^abc'  r'\^abc'

$ :匹配行尾

\ :\d=[0-9],\D=[^0-9],\s=[\t\n\r\f\v],\S=[^\t\n\r\f\v],\w=[a-zA-Z0-9],\W=[^a-zA-Z0-9]

  \[或\\取消所有的元字符

. :匹配任意字符

* :匹配零次或多次

+ :匹配一次或多次

?  :匹配一次或零次  例如:r"^010-?\d{8}$"

r=r"ab+?"    #'+?'是最小匹配模式,非贪婪模式
re.findall(r,'abbbbbbbb')  #结果是'ab'

 

{} :{m,n}最少重复m次,最多重复n次 {0,}=* {1,}=+ {0,1}=?

() :分组,经常和‘|’一起使用,例如email的正则表达式r'\w{3}@\w+(\.com|\.cn)'

  注意:findall匹配的正则表达式中有分组,先返回匹配分组中的数据

例如:

s='adjadlk hello src=csvt yes jojjlk  jlij hello src=python yes jopm'
r1=r'hello src=.+ yes'
re.findall(r1,s)   #结果['hello src=csvt yes','hello src=python yes']
r1=r'hello src=(.+) yes'
re.findall(r1,s)   #结果['csvt','python']

|

3、正则表达式的编译

编译后的正则表达式效率比编译前的要高许多,例如:

#匹配电话号码
r1=r"\d{3,4}-?\d{8}"
p_tel=re.compile(r1)   #编译后的正则表达式效率要高很多
p_tel.findall('010-12345678')

编译时,可以加一些参数,用来实现特殊功能和语法变更,例如:

csvt_re=re.compile(r'csvt',re.I)   #re.I表示在编译时忽略大小写
csvt_re.findall('CSVT')  #结果是['CSVT']
csvt_re.findall('csvt')  #结果是['csvt']
csvt_re.findall('CsVt')  #结果是['CsVt']

4、执行匹配

(1)match():决定RE是否在字符串刚开始的位置匹配。未匹配,返回None;否则,返回MatchObject对象

   MatchObject实例方法

    group():返回被RE匹配的字符串

    start():返回匹配开始的位置

    end():返回匹配结束的位置

    span():返回一个元组包含匹配(开始,结束)的位置

  实际程序中,最常见的做法是将MatchObject保存在一个变量中,然后检查他是否为None

(2)search():扫描字符串,找到这个RE匹配的位置。未匹配,返回None;否则,返回MatchObject对象

(3)findall():找到RE匹配的所有子串,并把他们作为一个列表返回

(4)finditer():找到RE匹配的所有子串,并把他们作为一个迭代器返回

5、模块级函数:match()、search()、sub()、subn()、split()、findall()等

(1)sub()用法举例:

rs=r'c..t'
re.sub(rs,'python','csvt caat cvvt cccc')  #结果'python python python cccc'

(2)subn()用法,返回值中比sub()多了一个数据,表示一共替换了多少次,比如

rs=r'c..t'
re.sub(rs,'python','csvt caat cvvt cccc')  #结果('python python python cccc',3)

(3)split()的用法

s='121+334-34*33/44'
re.split(r'[\+\-\*/]',s)  #结果['121','334','34','33','44']

6、编译标志-flags

 

posted @ 2015-06-22 20:46  sunflower627  阅读(209)  评论(0编辑  收藏  举报