微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

chapter15 正则表达式

核心编程


正则表达式使用的特殊符号和字符

记号 说明 举例

literal 匹配字符串的值 foo


re1|re2 匹配字符串1或者2 foo|bar



. 匹配任意字符(换行符除外) b.b


^ 匹配字符串的开始 ^bar

$ 匹配字符串的结尾 bar$


* 匹配前面出现的正则表达式零次或多次 bar*


+ 匹配前面出现的正则表达式一次或多次 bar+


? 匹配前面出现的正则表达式一次或零次 bar?



{N} 匹配前面出现的正则表达式N次 [0-9]{5}


{M,N} 匹配重复出现M次到N次的正则表达式 [0,9]{6,9}


[...] 匹配字符组里出现的任意一个字符 [dghjkl]


[..X-Y..] 匹配从字符x到y中的任意一个字符 [0-9a-z]


[^...] 不匹配此字符集中出现的任意一个字符 [^dghjkl]


(*|+|?|{})? 由于上面出现的任何‘非贪婪’版本重复匹配次数符号 .*?[a-z]

(*,+,?,{})


(...) 匹配封闭括号中正则表达式(RE),并保持为子组 ([0-9]{3}?,f(oo|u)bat)





special characters


\d 匹配任何数字,和[0-9]一样(\D是\d的反义:任何非数字符) data\d+.txt


\w 匹配任何数字字母字符,和[A-Za-z0-9]相同(\W是\w的反义) [A-Za-z_]\w+


\s 匹配任何空白符,和[\n\t\r\f]相同,(\S是\s的反义) of\sthe


\b 匹配单词的边界(\B是\b的反义) \blove\b


\nn 匹配已保存的子组 print:\16


\c 逐一匹配特殊字符c \.,\*,\\,\?


\A (\Z) 匹配字符串的起始(结束) \Adear



\A 和^是一样的,\Z 和$是一样的。


^/$ /\b /\B

“matching”和“searching” 之间的区别,“matching”是试图从整个字符串的开头进行匹配,而 “searching” 则可从一个字符串的任意位置开始匹配。正因为这几个字符和搜索的位置有关,所以需要和搜索模式一起使用

示例:


^From 匹配任何以From 开始的字符串

/bin/tcsh$ 匹配任何以 /bin/tcsh 结束的字符串

^Subject: hi$ 匹配仅由 Subject: hi 组成的字符串


RE Pattern Strings Matched

the 任何包含有"the"的字符串

\bthe 任何以"the"开始的字符串

\bthe\b 仅匹配单词 “the”

\Bthe 任意包含“the”但不以“the”开头的单词



创建字符类[]:[abcd],[1-9]匹配其中任意一个字符,很简单没什么好说的

使用闭包操作符 ( *,+,?,{} ) 实现多次出现/重复匹配


'?'的特殊作用:

问号出现了不只一次(被重载),问号有两种含义:1.单独使用时表示匹配出现零次或一次的情况,2.紧跟在表示重复的元字符后面时,表示要求搜索引擎匹配的字符串越短越好。例如:(+?)




match 和searching的区别:

match:匹配是指,判断一个字符串能否从起始处全部或部分的匹配某个模式

searching;搜索,即在字符串任意部分中查找匹配的模式


常见的正则表达式函数方法


函数/方法 描述

re 模块的函数

compile(pattern,flags=0) 对正则表达式模式pattern 进行编译,flags 是可选标志符,并返回一 个regex 对象


match(pattern,string,flags=0) 尝试用正则表达式模式pattern 匹配字符串string,flags 是可选标志 符,如果匹配成功,则返回一个匹配对象;否则返回None


search(pattern,flags=0) v在字符串string 中查找正则表达式模式pattern 的第

一次出现,flags 是可选标志符,如果匹配成功,则返回一个匹配对 象;否则返回None


findall(pattern,string[,flags]) 在字符串string 中查找正则表达式模式pattern 的所有(非重复)出 现;返回一个匹配对象的列表

finditer(pattern,flags]) 和findall()相同,但返回的不是列表而是迭代器;对于每个匹配 ,该迭代器返回一个匹配对象


split(pattern,max=0) 根据正则表达式pattern 中的分隔符把字符string 分割为一个 列表,返回成功匹配的列表,最多分割max 次(认是分割所有匹 配 的地方)。


sub(pattern,repl,max=0) 把字符串string 中所有匹配正则表达式pattern 的地方替换 成字符串repl,如果max 的值没有给出,则对所有匹配的地 方进行替换(另外,请参考subn(),它还会返回一个表示替换 次数的数值)。

group(num=0) 返回全部匹配对象(或指定编号是num 的子组)

groups() 返回一个包含全部匹配的子组的元组(如果没有成功匹配,就返 回一个元组)



m=re.match('foo','foo')

if m is not None:

m.group()


核心笔记 : Python 原始字符串(raw strings)的用法

你可能已经看到前面关于原始字符串用法的一些例子了。原始字符串的产生正是由于有正则表

达式的存在。原因是ASCII 字符和正则表达式特殊字符间所产生的冲突。比如,特殊符号“\b”在

ASCII 字符中代表退格键,但同时“\b”也是一个正则表达式的特殊符号,代表“匹配一个单词边界”。

为了让RE 编译器把两个字符“\b”当成你想要表达的字符串,而不是一个退格键,你需要用另一个

反斜线对它进行转义,即可以这样写:“\\b”。

但这样做会把问题复杂化,特别是当你的正则表达式字符串里有很多特殊字符时,就更容

易令人困惑了。在第六章,我们曾介绍过原始字符串,它经常被用于简化正则表达式的复杂程度。

事实上,很多Python 程序员在定义正则表达式时都只使用原始字符串。

(r'\bblow')



正则表达式示例:


from random import randint,choice

from string import lowercase

from sys import maxint

from time import ctime


doms = ( 'com','edu','net','org','gov' )

t=range(randint(5,10))

print t

for i in t:

dtint=randint(0,maxint-1) # pick date

print dtint

dtstr=ctime(dtint) # date string


shorter = randint(4,7) # login shorter

em = ''

for j in range(shorter):

em += choice(lowercase)

longer = randint(shorter,12) # domain longer

dn = ''

for j in range(longer):

dn += choice(lowercase)


print '%s::%s@%s.%s::%d-%d-%d' % (dtstr,em,dn,choice(doms),dtint,shorter,longer)


匹配一个字符串:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐