1、Python 之 re 模块Python 用“ “表示正则表达式中的 “ “,因为正则表达式中如果要匹配 “ “,需要用来转义,变成“ “,而 Python 语法中又需要对字符串中每一个进行转义,所以就变成了“ “。为了使正则表达式具有更好的可读性,Python 特别设计了原始字符串(raw string) raw string 就是用r作为字符串的前缀,如 r“n“:表示两个字符“和“n“,而不是换行符了。Python 中写正则表达式时推荐使用这种形式。例如: 可以使用 或者 进行匹配需要提醒你的是,在写文件路径的时候就不要使用 raw string 了,这里存在陷阱。 一:Re 模块正则匹
2、配:(1 )d 匹配任何十进制数;它相当于类 0-9。D 匹配任何非数字字符;它相当于类 0-9。s 匹配任何空白字符;它相当于类 fv。S 匹配任何非空白字符;它相当于类 fv。w 匹配任何字母数字字符;它相当于类 a-zA-Z0-9_。W 匹配任何非字母数字字符;它相当于类 a-zA-Z0-9_。具有重复功能的元字符:* 对于前一个字符重复 0 到无穷次+对于前一个字符重复 1 到无穷次?对于前一个字符重复 0 到 1 次m,n 对于前一个字符重复次数在为 m 到 n 次,其中,0, = *,1, = , 0,1 = ?m 对于前一个字符重复 m 次(2 )和$m = re.search(
3、r(www.)?,str)可以匹配 XXXm = re.search(r(www.)?,str)可以匹配 和 在元字符中,“在不同位置所代表的意义。 re.search(“abc“,“abcd“) #“在首字符表示取反,即 abc 之外的任意字符。 m=re.search(“abc“,“abcd“) m.group()d m=re.search(“abc“,“) #如果“ 在 中不是首字符,那么那就是一个普通字符 m.group()元字符($)匹配字符串的结尾或者字符串结尾的换行之前。m=re.search(“foo.$“,“foo1nfoo2n“,re.MULTILINE)print
4、m.group()foo1(3 )有几点注意的地方:1.m.n用来表示前面正则表达式重复 m 到 n 次,尝试匹配尽可能多的 copy。 re.findall(“a2,4“,“aaaaaaaa“)aaaa, aaaa#可以看到m,n,正则表达式优先匹配 n,而不是 m,因为结果不是“aa“,“aa“,“aa“,“aa“ re.findall(“a2“,“aaaaaaaa“)aa, aa, aa, aa#匹配重复两次 re.findall(“a2,4?“,“aaaaaaaa“)aa, aa, aa, aa#m,n? 用来表示前面正则表达式的 m 到 n 次 copy,尝试匹配尽可能少的 copy
5、 2.元字符“.”在默认模式下,匹配除换行符外的所有字符。在 DOTALL 模式下,匹配所有字符,包括换行符。 m=re.match(“.“,“n“) print mNone m=re.match(“.“,“n“,re.DOTALL)print “#“,m.group(),“#“#3.可以将匹配模式赋值给变量:pat=a-zA-Z+text=”Hm Er funshion?”funshion!m=re.findall(pat,text)print mHm, Er, funshion, funshionre 模块主要函数pile(pattern, flags=0)编译正则表达式,返回 Regex
6、Object 对象,然后可以通过 RegexObject 对象调用match()和 search()方法。prog = pile(pattern)result = prog.match(string)跟result = re.match(pattern, string)是等价的。re.search()和 re.match()str=m = re.match(rwww,str) m 不为 None 等同于 m=re.search(rwww,str)m = re.match(rcom,str) m 等于 Nonem=re.search(rcom,str) m 不为 Nonere.split(pat
7、tern, string, maxsplit=0)通过正则表达式将字符串分离。如果用括号将正则表达式括起来,那么匹配的字符串也会被列入到 list 中返回。maxsplit 是分离的次数,maxsplit=1 分离一次,默认为 0,不限制次数。默认分割符为空格。 re.split(W+, Words, words, words.) Words, words, words, re.split(W+), Words, words, words.) Words, , , words, , , words, ., re.split(W+, Words, words, words., 1) Words,
8、 words, words. 特别的:可以利用 split(n)去掉末尾的换行符re.findall()匹配所有子串,并把它们作为一个列表返回。从左到右有序地返回; 如果无匹配,返回空列表。 re.findall(“a“,“bcdef“) re.findall(r“d+“,“12a32bc43jf3“) 12, 32, 43, 3特别的:a=“abcdfana1b2c3“m=re.findall(“aw+“,a,re.MULTILINE)print a,m.group(0)abcdfa, a1b2c3m=re.findall(r“d+“,“12a,32c,n43j,3“,re.MULTILIN
9、E)print m12, 43多行匹配方式(包含n)只有在 multiline 下可以进行。rearch 和 match 匹配到就返回,不能匹配到多个结果,findall 可以匹配多个结果。上述结果可以验证,是匹配换行符之后,结果提示可以利用“”在 MULTILINE 模式可以匹配字符”n”后的字符re.sub()使用给定的替换内容将匹配模式的子字符串替换掉pat=nametext= hi namem=re.sub(pat,funshion,text)print mhi funshionre.finditer(pattern, string, flags=0)找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。这个匹配是从左到右有序地返回。如果无匹配,返回空列表。 it = re.finditer(r“d+“,“12a32bc43jf3“) for match in it: print match.group()12 32 43 3