标准库:一些最爱

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. iOS https认证 && SSL/TLS证书申请

    1.下面列出截止2016年底市面上常见的免费CA证书: 腾讯云SSL证书管理(赛门铁克TrustAsia DV SSL证书)阿里云云盾证书服务(赛门铁克DV SSL证书)百度云SSL证书服务Let's ...

  2. 水务新、老营收系统大PK

    今天想撩一下咱水务界的大拿——营业收费管理系统. 营业收费 随着城市供水规模的不断扩大及户表改造的深入以及阶梯水价的实行还有移动平台等第三方支付的蓬勃发展,原有的营收软件系统已经不能适应目前水司的管理 ...

  3. 【HTML+CSS】浅谈:相对定位与绝对定位

    相对定位和绝对定位 ·定位标签:position  ·包括属性:relative(相对) absolute(绝对) 1.position:relative; 假设对一个元素进行相对定位.首先它将出如今 ...

  4. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用 ...

  5. 【贪心】【POJ3154】墓地雕塑(Graveyard, NEERC 2006, LA 3708)需要稍稍加工的(先贪心,再确保能这样贪(可行性&&如果可行必定最优&&非证明最优性)的题)(K)

    例题4  墓地雕塑(Graveyard, NEERC 2006, LA 3708) 在一个周长为10000的圆上等距分布着n个雕塑.现在又有m个新雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周 ...

  6. [WARNING] Warning: selected war files include a WEB-INF/web.xml which will be ignored (webxml attribute is missing from war task, or ignoreWebxml attribute is specified as 'true')

    WARNING] Warning: selected war files include a WEB-INF/web.xml which will be ignored (webxml attribu ...

  7. C#比较两个时间大小

    DateTime t1 = Convert.ToDateTime("2012-12-31 23:59:00");            DateTime t2 = Convert. ...

  8. 一个SQL 建表格式

    CREATE TABLE [dbo].[SysSample]([Id] [varchar](50) NOT NULL,[Name] [varchar](50) NULL,[Age] [int] NUL ...

  9. 计算两个集合的交集数字(java)

    循环判断2个数组 将相同的公共元素复制到新数组中即可 import java.util.Arrays; public class count_same_number { public static i ...

  10. <转>java中静态方法和非静态方法的存储

    Java中非静态方法是否共用同一块内存? 将某 class 产生出一个 instance 之后,此 class 所有的 instance field 都会新增一份,那么所有的 instance met ...