核心编程
正则表达式使用的特殊符号和字符
记号 说明 举例
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,string, flags=0) v在字符串string 中查找正则表达式模式pattern 的第
一次出现,flags 是可选标志符,如果匹配成功,则返回一个匹配对 象;否则返回None
findall(pattern,string[,flags]) 在字符串string 中查找正则表达式模式pattern 的所有(非重复)出 现;返回一个匹配对象的列表
finditer(pattern,string[, flags]) 和findall()相同,但返回的不是列表而是迭代器;对于每个匹配 ,该迭代器返回一个匹配对象
split(pattern,string, max=0) 根据正则表达式pattern 中的分隔符把字符string 分割为一个 列表,返回成功匹配的列表,最多分割max 次(默认是分割所有匹 配 的地方)。
sub(pattern, repl, string, 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)
匹配一个字符串: