python基础——re(正则表达式)

1 python正则表达式

python中正则表达式一般使用自带的re模块,本文将简单介绍该模块的使用方法和注意事项。

1.1 原始字符串

在python中使用正则表达式时,建议使用原始字符串,也就是以r开头的字符串,如r"python"

1.2 转义字符

在re模块中有一些特殊字符,如.+?\等,这些字符在正则表达式中有特殊意义。但是让我们需要匹配这些符号时,比如我要匹配字符串中的?号,这时候就需要使用转义字符了。只需要在这些特殊字符前面加上反斜杠\就可以了。
比如,r"python\.org"用来匹配python.org

1.3 数量词的贪婪模式与非贪婪模式

在使用*+?这这几个表示数量的符号时,默认的情况是贪婪的(尽可能多的匹配字符)。而有时候需要使用非贪婪模式(尽可能少的匹配字符),这时候只需要在这几个符号后边再加一个?就是非贪婪模式了。例如:

查找字符串"aabbbcc"
贪婪模式下:r"ab*"   将匹配  "aabbb"
非贪婪模式:r"ab*?"  将匹配  "ab"

2 re模块简介

2.1 re模块方法简介

方法 描述
compile(pattern[, flag]) 根据正则表达式创建匹配对象
match(pattern, string[, flag]) 在字符串开始处开始匹配,返回matchObject或者None
search(pattern, string[, flag]) 在字符串中查找模式,返回matchObject或者None
split(pattern, string[, maxsplit]) 根据模式的匹配项来分割字符串
findall(pattern, string[, flag]) 以列表的形式返回匹配的所有子串
finditer(pattern, string[,flag]) 返回一个顺序访问每一个匹配结果(matchObject)的迭代器
sub(pattern, repl, string[, count]) 将字符串中的匹配项替换成指定字符串
subn(pattern, repl, string[, count]) 相比于sub方法,多返回一个替换次数

2.2 re.compile(pattern[, flag])

主要是将一个正则表达式编译成一个匹配模式对象(pattern),方便后续使用 。因为使用正则表达式匹配字符串时,都需要将正则表达式编译成匹配模式对象(pattern对象)。对于要频繁使用的正则表达式最好先调用compile方法将其编译好,后续使用时就省去了编译的时间。其中flag参数主要有如下选项:

flag 描述
re.I 忽略大小写
re.M 多行模式
re.S 点任意匹配模式
re.L 使预定义字符类 \w \W \b \B \s \S 取决于当前区域设定
re.U 使预定义字符类 \w \W \b \B \s \S 取决于unicode定义的字符属性
re.X 详细模式,正则表达式可以是多行的,忽略空白字符,可以加注释

2.3 re.match(pattern[, flag])

从string的开头开始匹配,如果成功返回一个matchObject,否则返回None。matchObject提供如下属性和方法,来获取匹配的子串的信息:

方法与属性 描述
string 匹配时使用的字符串
re 匹配时使用的pattern对象
pos 文本中正则表达式开始搜索的索引
endpos 最后一个被捕获的分组在文本中的索引,默认为None
lastgroup 最后一个被捕获的分组的别名
group([g1, g2, ...]) 获得一个或者多个分组截获的字符串;指定多个参数时,以元组形式返回;g1可以使用编号也可以使用别名,其中编号0表示整个匹配的子串;默认返回None
groups() 以元组的形式返回全部分组截获的字符串
groupdict() 返回以有别名的组的别名为键、以组截获的字符串为值的字典,不包含没有别名的
start([g]) 返回指定的组截获的字串在string中的开始索引,group默认为0
end([g]) 返回指定的组截获的字串在string中的结束索引(最后一个字符索引+1),group默认为0
span([g]) 返回(start([group]), end([group]))
expand(template) 将匹配的分组带入tmplate中返回

例程如下:

>>> ptn = re.compile(r"(\w+) (\w+)(?P<sign>.*)")
>>> m = ptn.match("hello world!")
>>> print "m.string:", m.string
m.string: hello world!
>>> print "m.re:", m.re
m.re: <_sre.SRE_Pattern object at 0x10af6c030>
>>> print "m.pos:", m.pos
m.pos: 0
>>> print "m.endpos:", m.endpos
m.endpos: 12
>>> print "m.lastindex:", m.lastindex
m.lastindex: 3
>>> print "m.lastgroup:", m.lastgroup
m.lastgroup: sign
>>> print "m.group():", m.group()
m.group(): hello world!
>>> print "m.group(1,2):", m.group(1, 2)
m.group(1,2): ('hello', 'world')
>>> print "m.groups():", m.groups()
m.groups(): ('hello', 'world', '!')
>>> print "m.groupdict():", m.groupdict()
m.groupdict(): {'sign': '!'}
>>> print "m.start(2):", m.start(2)
m.start(2): 6
>>> print "m.end(2):", m.end(2)
m.end(2): 11
>>> print "m.span(2):", m.span(2)
m.span(2): (6, 11)
>>> print r"m.expand(r'\g \g\g'):", m.expand(r'\2 \1\3')
m.expand(r'\g \g\g'): world hello!

2.4 re.search(pattern[, flag])

扫描整个string查找匹配的子串,如果成功返回一个matchObject对象,否则返回None

2.5 re.split(pattern, string[, maxsplit])

按照能够匹配的字串将string分割,并返回列表,maxsplit用于指定最大分割次数。例程如下:

>>> ptn = re.compile(r"\d+")
>>> print ptn.split("one1two2three34four4")
['one', 'two', 'three', 'four', '']

2.6 re.findall(pattern, string[, flag])

搜索string,以列表形式返回全部能够匹配的子串,例程如下:

>>> ptn = re.compile(r"\d+")
>>> print ptn.findall("one1two2three34four4")
['1', '2', '34', '4']

2.7 re.finditer(pattern, string[, flag])

搜索string,返回一个顺序访问每一个匹配结果(MatchObject)的迭代器,例程如下

>>> pattern = re.compile(r'\d+')
>>> for m in re.finditer(pattern,'one1two2three3four4'):
...     print m.group()
...
1
2
3
4

2.8 re.sub(pattern, repl, string[, count])

使用repl替换string中每一个匹配的字串后,返回替换后的字符串
1)当repl是一个字符串时,可以使用\id或者\g引用分组,但不能使用编号0,如下:
2)当repl是一个方法时,这个方法只接受一个matchObject对象作为参数,并放回一个字符串用于替换
count用于指定最多替换次数,不指定时全部替换
例程如下:

>>> ptn = re.compile(r"(\w+) (\w+)")
>>> s = "i say, hello world!"
>>> print ptn.sub("replace", s)    #使用普通字符串
replace, replace!
>>> print ptn.sub(r"\2 \1", s)     #使用\id引用分组
say i, world hello!
>>> def func(m):
...     return m.group(1).title() + " " + m.group(2).title()
...
>>> print re.sub(ptn, func, s)      #使用方法
I Say, Hello World!

2.9 re.subn(pattern, repl, string[, count])

返回(sub(pattern, repl, string[, count]), 替换次数)

3 正则表达式的语法规范

20130515113723855.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容

  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 3,975评论 0 13
  • 本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例...
    Python程序媛阅读 1,338评论 0 22
  • 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工...
    随风化作雨阅读 347评论 0 0
  • 使用 Python 模块 re 实现解析小工具 孙 翎, 贺 皓, 和 张 晗 2011 年 4 月 12 日发布...
    种花家LY阅读 3,541评论 0 21
  • 初听徐薇版的《我以为》,我襻着褪了漆的阑干,细疏的发梢完好的掩映了盘曲的耳塞,手心捏紧MP3,摘掉眼镜后的世界,...
    如果多一秒阅读 521评论 0 1