您的位置:首页 > 编程语言 > Python开发

python 基础学习 正则表达式2(使用)

2015-06-03 13:25 911 查看
~使用正则表达式
- re模块提供了一个正则表达式引擎的接口,可以让你将REstring编译成对象并用他们来进行匹配。
#如果经常使用,建议编译 compile

范例:
>>> r1=r'^\d{3,4}-?\d{8}'
>>> re.findall(r1,'010-12345678')
['010-12345678']
>>> p_tel=re.compile(r1)
#正则编译,变为对象,利用re模块里的complie方法对r1编译;
>>> p_tel
<_sre.SRE_Pattern object at 0x7f2e016173d0>
#正则对象
>>> p_tel.findall('01035689125')
['01035689125']
#编译的正则比未编译的正则效率高

----------------------------------------------------------------------------------------------------------
-re.compile()也接受可选的标志参数,关注re.I
-常用来实现不同的特殊功能和语法变更
范例:
>>> csvt_re=re.compile(r'csvt',re.I)
#在编译过程中,添加正则属性re.I(不区分大小写)
>>> csvt_re.findall('csvtCSVT')
['csvt', 'CSVT']
#注意:字符串前添加'r',反斜杠就不会被任何特殊方式处理

----------------------------------------------------------------------------------------------------------
执行匹配:
-`RegexObject` 实例有一些方法和属性,完整的列表可查阅Python Library Reference
<
方法/属性作用
match()决定RE是否在字符串刚开始的位置匹配
search()扫描字符串,找到这个RE匹配的位置
findall()找到RE匹配的所有子串,并把它作为一个列表返回
finditer()找到RE匹配的所有子串,并把它作为一个迭代器返回
如果没有匹配到的话,match()和search将返回None
如果成功的话,就会返回一个`MatchObject`实例。
范例:
使用match

>>> csvt_re=re.compile(r'csvt',re.I)
>>> csvt_re.match('csvt hello')
<_sre.SRE_Match object at 0x7f2e01620920>
#匹配成功。返回MacthObject
>>> csvt_re.match(' hello')
#匹配失败,返回空
>>> csvt_re.match(' hello CSVT')
#返回为空,注意match匹配的是字符串开始的位置
如果使用search
>>> csvt_re.search('hello CSVT')
<_sre.SRE_Match object at 0x7f2e01620988>
>>> csvt_re.search('hello CSvT')
<_sre.SRE_Match object at 0x7f2e01620920>
#注意此处为不区分大小写,且是全表扫描
使用findall
>>> csvt_re.findall('hello CSvT hello CSvt csvt')
['CSvT', 'CSvt', 'csvt']
#返回为列表
使用finditer

>>> csvt_re.finditer('hello CSvT hello CSvt csvt')
<callable-iterator object at 0x7f2e01634350>
#返回为迭代器的对象
>>> csvt_re.findall('csvT')
['csvT']
match() MatchObject实例方法

方法/属性作用
group()返回被RE匹配的字符串
start()返回匹配开始的位置
end()返回匹配结束的位置
span()返回一个元组包含匹配(开始,结束)的位置
group() :返回对象

>>> csvt_re=re.compile(r'csvt',re.I)
>>> x =csvt_re.match('CSVT,hello')
>>> x
<_sre.SRE_Match object at 0x7fa4f527f920>
>>> x.group()
'CSVT'
----------------------------------------------------------------------------------------------------------
-模块级函数
-re模块也提供了顶级函数调用match()、search()、subn()、split()、findall()等
sub、subn :正则替换
范例:
#单纯的字符串替换
>>> kong = 'hello nihao'
>>> kong.replace('nihao','word')
'hello word'
#使用正则
>>> rs = r'n...o'
>>> kong = 'hello nihao naabo nccco'
>>> re.sub(rs,'bbb',kong)
'hello bbb bbb bbb'
#匹配替换所有
>>> re.subn(rs,'bbb',kong)
('hello bbb bbb bbb', 3)
#sub 和 subn 的区别 ,替换计数
split() :正则切割
#字符切割
>>> ip = '1.2.3.4'
>>> ip.split('.')
['1', '2', '3', '4']
>>> s = "123+456-789*000"
>>> re.split(r'[\+\-\*\/]',s)
['123', '456', '789', '000']


#查看更多正则函数:
>>> dir(re)
#查看帮助:

help(re.error)

.编译标志-flags
标志含义
DOTALL,S使.匹配包括换行在内的所有字符
范例:
>>> import re
>>> r1=r'csvt.net'
>>> re.findall(r1,'csvt.net')
['csvt.net']
>>> re.findall(r1,'csvtnnet')
['csvtnnet']
>>> re.findall(r1,'csvtxnet')
['csvtxnet']
>>> re.findall(r1,'csvt\nnet')
[]
>>> re.findall(r1,'csvt\nnet',re.S)
['csvt\nnet']
>>> re.findall(r1,'csvt\tnet',re.S)
['csvt\tnet']

IGNORECASE,I使匹配对大小写不敏感
范例:
>>> import re
>>> r2 = r'csvt'
>>> re.findall(r2,'CSVT csvt',re.I)
['CSVT', 'csvt']
>>> re.findall(r2,'CSVT csvt')
['csvt']
LOCALE,L做本地化识别(locale-aware)匹配.语法等
MULTILINE,M多行匹配,影响^和$
范例:
>>> s = ''' hello csvt
... csvt hellp
... hello csvt hello
... csvt hehe
... '''
>>> r1 = r'^csvt'  #正则定义注意^
>>> re.findall(r1,s)
[]                 #无法匹配
>>> s
' hello csvt\ncsvt hellp\nhello csvt hello\ncsvt hehe\n'
>>> re.findall(r1,s,re.M)   #使用re.M
['csvt', 'csvt']

VERBOSE,X能够使用REs的verbose状态,使之被组织得更清晰易懂
范例:
>>> r1 = r'''
... \d{3,4}
... -?
... \d{8}
... $
... '''
>>> re.findall(r1,'010-12345678',re.X)
['010-12345678']
>>> re.findall(r1,'010-12345678')
[]
#问题:上述正则同时出现^,该如何匹配

本文出自 “思想大于技术” 博客,谢绝转载!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: