正则表达式(regular expression):主要用来匹配字符串,是网页HTML tag分析,字符串处理,网页爬虫的利器!例如验证邮箱;
通配符:点号.可以匹配任何字符(除了换行符);
转义字符:\(反斜杠):对特殊字符,需加\,例如python\.org则会匹配python.org;
字符集:[]:[pc]ython能够匹配python和cython。
字符可以单个列出,也可以用“-”号分隔的两个给定字符来表示一个字符区间。
可以使用范围,如[a-zA-Z0-9]能够匹配任意大小写字母和数字(只能匹配一个这样的字符)
元字符:$ .^ * + ? { } [ ] \ | ( )
选择符和子模式:| 例如python|perl:表示python或者是perl中的一个;
圆括号( ):子模式。例如python|perl可以写成为 p(ython|erl)
可选项和重复子模式:在子模式后加上问号,就变成可选项,如:r’(http://)?(www.)?py’只能匹配字符串’http://www.py‘,’http://py‘,’www.py’,’py’中的一个。
问号?允许子模式出现一次或者不出现:
(pattern)*:允许模式重复0次或者多次;
(pattern)+:允许模式重复>=0次;
(pattern){m,n}:允许模式重复出现m到n次。其中,{0,} 为0次到无穷次,{1,} 为大于等于一次 , {0,1} = 不出现或出现一次
(pattern){m} 对于前一个字符重复m次
字符串的开始和结尾: 开头用脱字符^,尾部使用$;
\d 匹配任何十进制数,它相当于[0-9],可以匹配一个数字;
\D 匹配任何非数字字符;它相当于[^0-9];
\s 匹配任何空白字符;它相当于[ fv];\s可以匹配一个空格(也包括Tab等空白符);
\S 匹配任何非空白字符;它相当于[^ fv];
\w 匹配任何字母数字字符;它相当于[a-zA-Z0-9_];可以匹配一个字母或数字
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_];
.可以匹配一个任意字符,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符:
更精确地匹配,可以用[]表示范围,比如:[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;
[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。
A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。
^表示行的开头,^\d表示必须以数字开头。
$表示行的结束,\d$表示必须以数字结束。
判断正则表达式是否匹配:
>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object at 0x1026e18b8>
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
>>>
match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。
test = '用户输入的字符串'
if re.match(r'正则表达式', test):
print 'ok'
else:
print 'failed'
>>> re.split(r'\s+', 'a b c')
['a', 'b', 'c']
>>> re.split(r'[\s\,]+', 'a,b, c d')
['a', 'b', 'c', 'd']
>>> re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']
用()表示的就是要提取的分组;
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串;
>>> t = '19:05:30'
>>> m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
>>> m.groups()
('19', '05', '30')#这个正则表达式可以直接识别合法的时间
正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符:
>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。
必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:
>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
re正则表达式模块还包括一些有用的操作正则表达式的函数。
compile函数compile(pattern[, flags=0])
Compile a regular expression pattern, returning a pattern object.返回一个模式对象;
返回一个pattern对象,flags是匹配模式,可以使用按位’&’或’|’表示同时生效,也可以在正则表达式字符串中指定。Pattern对象是不能直接实例化的,只能通过compile方法得到。匹配模式有:
1).re.I(re.IGNORECASE): 忽略大小写
2).re.M(MULTILINE): 多行模式,改变’^’和’$’的行为
3).re.S(DOTALL): 点任意匹配模式,改变’.’的行为
4).re.L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定
5).re.U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性
6).re.X(VERBOSE): 详细模式,正则表达式可以是多行,忽略空白字符,并可以加入注释
例如:pattern1 = re.compile(r”“”\d + #整数部分
. #小数点
\d * #小数部分”“”, re.X) #匹配模式设置为re.X 可以多行匹配。
函数re.compile将正则表达式(以字符串书写的)转换为模式对象,可以实现更加有效的匹配。
import re
text = "JGood is a handsome boy, he is cool, clever, and so on..."
re.findall(r'\w*oo\w*', text) #查找所有包含'oo'的单词
import re
text = “JGood is a handsome boy, he is cool, clever, and so on…”
regex = re.compile(r’\w*oo\w*’)
print regex.findall(text) #查找所有包含’oo’的单词
match函数earch函数
定义: re.match 尝试从字符串的开始匹配一个模式。
re.match(pattern, string, flags)
第一个参数是正则表达式,如果匹配成功,则返回一个Match对象,否则返回一个None;
第二个参数表示要匹配的字符串;
第三个参数是标致位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等。
函数的返回值为真或者假。
定义:re.search会在给定字符串中寻找第一个匹配给定正则表达式的子字符串;
函数的返回值:如果查找到则返回查找到的值,否则返回为None。
re.search(pattern, string, flags)
import re
content='Where are you from? You look so hansome.'
regex=re.compile(r'\w*som\w*')
m=regex.search(content)
if m:
print m.group(0)
else:
print "Not found"
group() 返回被 RE 匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组,包含匹配 (开始,结束) 的位置
>import re
>n=re.compile(r'\w+')
>h=n.match("winter comes") #这里作用同h=re.match(r'\w+',"winter comes")
>print h.group()
winter
>print h.start()0
>print h.end()6
>print h.span()
(0,6)
如果在match函数中使用()子模式的输出与上面情况稍有不同,举例说明:
import re
m=re.match(r'www\.(.*)\..{3}','www.python.org')
print m.group() #效果同m.group(0)#'www.python.org'
print m.group(1)#'python'
import re
m=re.match(r'(www\.(.*)\..{3})','www.python.org')
print m.group(0) #效果与print m.group(1)相同 输出()的内容 为第一层括号#www.python.org
print m.group(2) #输出第二层括号的内容 即(.*)的内容#python
print m.group(3) #出错#程序出现异常
import re
m=re.match(r'(www\.(.*)\.(.{3}))','www.python.org')
print m.group(0) #效果与print m.group(1)相同 输出()的内容 为第一层括号#www.python.org
print m.group(2)#python
print m.group(3)#org
re.split
可以使用re.split来分割字符串,如:re.split(r’\s+’, text);将字符串按空格分割成一个单词列表。
re.split(pattern, string, maxsplit=0)
通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到list中返回。maxsplit是分离的次数,maxsplit=1分离一次,默认为0,不限制次数。
例如:re.split(‘\W+’, ‘Words, words, words.’)
[‘Words’, ‘words’, ‘words’, ”]
如果字符串不能匹配,将会返回整个字符串的list。
re.findall
找到RE匹配的所有子串,并把它们作为一个列表返回。这个匹配是从左到右有序地返回。如果无匹配,返回空列表。
re.findall(pattern, string, flags=0)
re.findall(“a”,”bcdef”) -->[]
re.findall(r”\d+”,”12a32bc43jf3”) -->[‘12’, ‘32’, ‘43’, ‘3’]
finditer
finditer( rule , target [,flag] ) 返回一个迭代器
迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。
对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值)。但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式。
迭代器的另一个优点就是它不要求你事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。这个特点被称为延迟计算或惰性求值(Lazy evaluation)。
迭代器更大的功劳是提供了一个统一的访问集合的接口。只要是实现了iter()方法的对象,就可以使用迭代器进行访问。
使用迭代器:使用内建的工厂函数iter(iterable)可以获取迭代器对象:
re.sub主要功能实现正则的替换
re.sub定义: sub(pattern, repl, string,count=0,flags=0)
Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable; if a string, backslash escapes in it are processed. If it is a callable, it’s passed the match object and must return
a replacement string to be used.
主要的意思为:对字符串string按照正则表达式pattern,将string的匹配项替换成字符串repl。
pattern为表示正则中的模式字符串,
repl为replacement,被替换的内容,repl可以是字符串,也可以是函数。
string为正则表达式匹配的内容。
count:由于正则表达式匹配到的结果是多个,使用count来限定替换的个数(顺序为从左向右),默认值为0,替换所有的匹配到的结果。
flags是匹配模式,可以使用按位或’|’表示同时生效,也可以在正则表达式字符串中指定。
re.sub(r'\w+','10',"ji 43 af,geq",count=2,flags=re.I)
escape(pattern)
Escape all non-alphanumeric(非字母数字字符) characters in pattern.
re.escape(pattern) 可以对字符串中所有可能被解释为正则运算符的字符进行转义的应用函数。如果字符串很长且包含很多特殊技字符,而你又不想输入一大堆反斜杠,或者字符串来自于用户(比如通过raw_input函数获取输入的内容),且要用作正则表达式的一部分的时候,可以使用这个函数。
组就是放置在圆括号里内的子模块,组的序号取决于它左侧的括号数。组0就是整个模块;