标准库:一些最爱

re

re模块包括对正則表達式的支持,由于以前系统学习过正則表達式,所以基础内容略过,直接看python对于正則表達式的支持。

正則表達式的学习,见《Mastering Regular Expressions》(精通正則表達式)

re模块的内容

最重要的一些函数

函数

描写叙述

compile(pattern[,flags])

依据包括正則表達式的字符串创建模式对象

search(pattern,string[,flags])

在字符串中寻找模式

match(pattern,string[,flags])

在字符串的開始处匹配模式

split(pattern,string,maxsplit=0])

依据模式的匹配项来分隔字符串

findall(pattern,string)

列出字符串中模式的全部匹配项

sub(pat,repl,string[,count=0])

将字符串中全部pat的匹配项用repl替换

escape(string)

将字符串中全部特殊正則表達式字符转义

函数re.compile将正則表達式(以字符串书写的)转换为模式对象,能够实现更有效率的匹配。假设在调用search或者match函数的时候使用字符串表示的正則表達式,它们会在内部将字符串转换为正則表達式对象。使用compile完毕一次转换之后,在每次使用模式的时候就不用进行转换。模式对象本身也有查找/匹配的函数,就像方法一样,所以re.search(pat,string)(pat是用字符串表示的正則表達式)等价于pat.searching(string)(pat是用compile创建的模式对象)。经过compile转换的正則表達式对象也能用于普通的re函数。

函数re.search会在给定字符串中寻找第一个匹配给定正則表達式的子字符串。一旦找到子字符串,函数就会返回MatchObject(值为True),否则返回None(值为False)。

函数re.match会在给定字符串的开头匹配正則表達式。因此,match(‘p’,’python’)返回真,而re.match(‘p’,’www.python.org’)则返回假(None)。

注意:假设模式与字符串的開始部分相匹配,那么match函数会给出匹配的结果,而模式并不须要匹配整个字符串。假设要求模式匹配整个字符串,那么能够在模式的结尾加上美元符号。美元符号会对字符串的末尾进行匹配,从而顺延了整个匹配。

函数re.split会依据模式的匹配项来切割字符串。类似于字符串的split,只是是用完整的正則表達式取代了固定的分隔符字符串。

>>> import re

>>> some_text="alpha, beta .... gamma delta"

>>> re.split('[. ]+',some_text)

['alpha,', 'beta', 'gamma', 'delta']

>>> re.split('ta',some_text)

['alpha, be', ' .... gamma del', '']

maxsplit參数表示字符串最多能够切割成的部分数:

>>> re.split('[. ]+',some_text,maxsplit=1)

['alpha,', 'beta .... gamma delta']

>>> re.split('[. ]+',some_text,maxsplit=2)

['alpha,', 'beta', 'gamma delta']

>>> re.split('[. ]+',some_text,maxsplit=0)

['alpha,', 'beta', 'gamma', 'delta']

>>> re.split('[. ]+',some_text,maxsplit=-2)

['alpha, beta .... gamma delta']

函数re.findall以列表形式返回给定模式的全部匹配项:

>>> re.findall('[. ]+',some_text)

[' ', ' .... ', ' ']

函数re.sub的作用在于:使用给定的替换内容将匹配模式的子字符串(最左端而且非重叠的子字符串)替换掉。

>>> re.sub('{name}',some_text,'Dear {name}')

'Dear alpha, beta .... gamma delta'

re.escape是一个非常有用的函数,它能够对字符串中全部可能被解释为正则运算符的字符进行转义的应用函数。

>>> re.escape('`~-_=+[{]}\|;:"/?.>,<')

'\\`\\~\\-\\_\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\"\\/\\?\\.\\>\\,\\<'

>>> re.escape('www.baidu.com')

'www\\.baidu\\.com'

匹配对象和组

对于re模块中那些可以对字符串进行模式匹配的函数而言,当能找到匹配项的时候,它们都会返回MatchObject对象。这些对象包括匹配模式的子字符串的信息。它们还包括了哪个模式匹配了子字符串哪部分的信息——组(group)。

就是整个模式。

re匹配对象的一些重要方法

方法

描写叙述

group([group1,...])

获取给定子模式(组)的匹配项

start([group])

返回给定组的匹配项的開始位置

end([group])

返回给定组的匹配项的结束位置(和分片一样,不包含组的结束位置)

span([group])

返回一个组的開始和结束位置

>>> m=re.match('.{4}://(.{4})\.(.{4})\..{3}/.{8}','http://blog.csdn.net/signjing')

>>> m.group(1)

'blog'

>>> m.group(2)

'csdn'

>>> m.start(1)

7

>>> m.start(2)

12

>>> m.span(1)

(7, 11)

>>> m.span(2)

(12, 16)

作为替换的组号和函数

见证re.sub强大功能的最简单方式就是在替换字符串中使用组号。在替换内容中以’\\n’形式出现的不论什么转义序列都会被模式中与组n匹配的字符串替换掉。

将”http://blog.csdn.net/signjing”中的’/’(不包含http头中的’/’)变为’\\’:

>>> pat=r'([^:/])/([^:/]*)'

>>> re.sub(pat,r'\1\\\2','http://blog.csdn.net/signjing')

'http://blog.csdn.net\\signjing'

注意:正則表達式非常easy变得难以理解,使用有意义的变量名或加上一两句凝视是非常重要的。

让正則表達式变得更加易读的方式是在re函数中使用VERBOSE标志。它同意在模式中加入空白(空白字符、tab、换行符,等等),re则会忽略它们——除非将其放在字符类或者用反斜线转义。也能够在冗长的正则式中加入凝视。

>>> pat=re.compile(r'''

( #開始第一个组

[^:/] #匹配一个不包含:和/的字符,主要目的是排除http头中的/

) #结束第一个组

/  #匹配/

( #開始第二个组

[^:/]* #匹配随意多个不包含:和/的字符串

) #结束第二个组

''',re.VERBOSE)

>>> re.sub(pat,r'\1\\\2','http://blog.csdn.net/signjing')

'http://blog.csdn.net\\signjing'

模板系统

模板是一种通过放入详细值从而得到某种已完毕文本的文件。python有一种高级的模板机制——字符串格式化。但正則表達式能够让系统更加高级。

精通不论什么程序设计语言的最佳方法是实践——測试它的限制,探索它的能力。

练习 匹配字符串

脚本内容

$ cat re-example-1.py

#File : re-example-1.py

import re

text="The Attila the Hun Show"

print text

m=re.match(".",text)

if m:   print repr("."),"=>",repr(m.group(0))

m=re.match(".*",text)

if m:   print repr(".*"),"=>",repr(m.group(0))

m=re.match("\w+",text)

if m:   print repr("\w+"),"=>",repr(m.group(0))

m=re.match("\d+",text)

if m:   print repr("\d+"),"=>",repr(m.group(0))

运行结果

$ python re-example-1.py

The Attila the Hun Show

'.' => 'T'

'.*' => 'The Attila the Hun Show'

'\\w+' => 'The'

练习 提取匹配的子字符串

脚本内容

$ cat re-example-2.py

#File: re-example-2.py

import re

text="2014/06/24"

m=re.match('(\d{4})/(\d{2})/(\d{2})',text)

if m:

print m.group(1,2,3)

运行结果

$ python re-example-2.py

('2014', '06', '24')

练习 查找子字符串

脚本内容

$ cat re-example-3.py

#File: re-example-3.py

import re

text="There is one Date: 2014/6/24 in here!"

m=re.search('(\d{4})/(\d{1,2})/(\d{1,2})',text)

print m.group(1),m.group(2),m.group(3)

month,day,year=m.group(2,3,1)

print month,day,year

date=m.group(0)

print date

运行结果

$ python re-example-3.py

2014 6 24

6 24 2014

2014/6/24

练习 替换子字符串

脚本内容

$ cat re-example-4.py

# File : re-example-4.py

import re

text="You're no fun anymore ..."

print re.sub('fun','interesting',text)

print re.sub("[^\w]+","-",text)

print re.sub("\S+","-BEEP-",text)

运行结果

$ python re-example-4.py

You're no interesting anymore ...

You-re-no-fun-anymore-

-BEEP- -BEEP- -BEEP- -BEEP- -BEEP-

练习 通过回调函数替换子字符串

脚本内容

$ cat re-example-5.py

#File : re-example-5.py

import re

import string

text="a line of text\\012another line of text\\012etc..."

def octal(match):

return chr(string.atoi(match.group(1),8))

octal_pattern=re.compile(r"\\(\d\d\d)")

print text

print octal_pattern.sub(octal,text)

运行结果

$ python re-example-5.py

a line of text\012another line of text\012etc...

a line of text

another line of text

etc...

练习 匹配多个模式中的一个

脚本内容

$ cat re-example-6.py

#File : re-example-6.py

import re,string

def combined_pattern(patterns):

p=re.compile(

string.join(map(lambda x: "("+x+")",patterns),"|")

)

def fixup(v,m=p.match,r=range(0,len(patterns))):

try:

regs=m(v).regs

except AttributeError:

return None

else:

for i in r:

if regs[i+1] != (-1,-1):

return i

return fixup

patterns=[

r"\d+",

r"abc\d{2,4}",

r"p\w+"

]

p = combined_pattern(patterns)

print p("129391")

print p("abc800")

print p("abc1600")

print p("python")

print p("perl")

print p("tcl")

运行结果

$ python re-example-6.py

0

1

1

2

2

None

python基础教程_学习笔记14:标准库:一些最爱——re的更多相关文章

  1. python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36201499 标准库:一些最爱 集合.堆和双端队 ...

  2. python基础教程_学习笔记18:标准库:一些最爱——shelve

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36029981 标准库:一些最爱 shelve S ...

  3. python基础教程_学习笔记12:充电时刻——模块

    充电时刻--模块 python的标准安装包含一组模块,称为标准库. 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 不论什 ...

  4. python基础教程_学习笔记1:序列-1

    序列 数据结构:通过某种方式组织在一起的数据元素的集合,这些数据元素能够是数字或者字符,甚至能够是其它数据结构. python中,最主要的数据结构是序列. 序列中的每一个元素被分配一个序号--即元素的 ...

  5. python基础教程_学习笔记10:异常

    异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.假设异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止运行: >>> ...

  6. python基础教程_学习笔记9:抽象

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/30745465 抽象 懒惰即美德. 抽象和结构 抽 ...

  7. python基础教程_学习笔记11:魔法方法、属性和迭代器

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/31417309 魔法方法.属性和迭代器 在pyth ...

  8. python基础课程_学习笔记15:标准库:有些收藏夹——fileinput

    标准库:有些收藏夹 fileinput 重要功能 性能 叙述性说明 input([files[,inplace[,backup]]) 便于遍历多个输入流中的行 filename() 返回当前文件的名称 ...

  9. python基础课程_学习笔记20:标准库:有些收藏夹——os

    标准库:有些收藏夹 os os模块为您提供访问多个操作系统服务特征. os和它的子模块os.path还包含一些用于检查.构造.删除文件夹和文件的函数,以及一些处理路径的函数. os模块中一些重要函数和 ...

随机推荐

  1. SDK调试出错小技巧=。=

    学习Unity小伙伴完全不懂Android编程抓错误是很困难的..... 1. 使用UnityPlayer.UnitySendMessage(); 发送到Unity使用OnGUI显示错误 2. 直接在 ...

  2. 了解SQL注入攻击

    SQL注入:利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义. 随着B/S模式被广泛的应用,用这种模式编写应用程序的程序员也越来越多,但由于开发人员的水 ...

  3. 代码中实际运用memcached——.NET

    本文取自:http://blog.csdn.net/dyllove98/article/details/9115947 memcached安装:============================ ...

  4. Android 属性动画(Property Animation) 全然解析 (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...

  5. Visual Studio® 2010 Web Deployment Projects站点编译生成bin同时发表插件

    VS2010环境下: 1.Visual Studio® 2010 Web Deployment Projects下载地址:        http://www.microsoft.com/downlo ...

  6. struts2 action重定向

    struts2的结果类型: <action name="loginAction" class="com.itheima.action.LoginAction&quo ...

  7. cookie 和 session 基本使用 以及 封装

    Cookie: 是一小段文本信息,用户请求页面的时候,在浏览器和服务器之间传递.用户每次访问的时候都会记录cookie,cookie里可以包含用户信息,浏览的历史记录等等:Cookie是由服务器端生成 ...

  8. 推荐10款 好用的 Jquery 评分插件

    Raty jQuery Raty这是一个能够自动生成可定制的星级评分jQuery插件.可以自定义图标,创建各种评级组合,星星数量,每一颗星星的注释,可以在当一个星星被点击时的加回调函数. 地址: Ra ...

  9. background小结

    CSS背景属性Background详解 本文详解了CSS的背景属性Background,包括CSS3中新增的背景属性.如果你是个CSS初学者,还可以查看之前介绍的CSS浮动属性和CSS透明属性详解. ...

  10. js数字验证

    1.JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g, ...