python正则表达式功能模块:re
matchObj = re.match(r'(\d+)([abcd]+)', '12bbcxyz') #[abcd]表示:a或b或c或dif matchObj: print matchObj.groups() #('12', 'bbc') print matchObj.group() #12bbc print matchObj.group(1) #12 print matchObj.group(2) #bbc# print matchObj.group(3) #报错IndexError: no such groupelse: print 'None match'
re.match()
方法:
参数1是正则表达式匹配模式,参数2是待匹配的原始字符串;
此方法只从字符串的开头匹配,若开头不匹配即使字符串中间有子串能匹配也返回None
。如参数2换为'a12bbcxyz'
则输出None match
。 re.search()
方法:
和match
方法参数一样,不过可以匹配字符串里面的子串,如参数2换为'a12bbcxyz'
则输出不变。
match
和search
两个方法只能找到匹配参数1匹配模式的,从参数2原始字符串左起的第一个字符串。若想找到所有的匹配的字符串,用下面介绍的findall
方法。 若匹配成功则返回一个匹配对象:matchObj
:
其有group(num=0)
和groups()
方法:
group(n)(n=1、2、3…)
会返回同第n分组匹配的字符串(参数1匹配模式里的每个括号里是一个分组);group()
方法有默认参数0
,group(0)
会返回同整个参数1模式匹配的字符串(这个非分组);groups()
方法返回所有分组组成的元组(若无分组返回空元组),第一个分组的组号为1。 findall方法:
findres = re.findall(r'\d[a-z]', '1one2two')print findres #['1o', '2t']findres = re.findall(r'(\d)[a-z]', '1one2two')print findres #['1', '2']findres = re.findall(r'(\d)([a-z])', '1one2two')print findres #[('1', 'o'), ('2', 't')]
若参数1匹配模式无分组:则返回所有同整个匹配模式匹配的字符串组成的列表;
若参数1有分组:若只有1个分组,则返回所有同分组匹配的字符串组成的列表;若分组数大于1,则返回所有同各分组匹配的字符串组成的元组的列表。加入匹配标志位flags
:
pattern = re.compile('(.*)', re.M)div_list = re.findall(pattern, page)print(div_list)
正则替换:sub方法
普通字符串替换:
print 'ABC'.replace('A' , 'a') #aBC
正则替换:
print re.sub(r'\d', '*', '123bbc', count=2) # **3bbc count=2表示进行2次替换print re.sub(r'\d+', '*', '123bbc', count=2) # *bbc 此处只进行了1次替换print re.sub(r'\d+?', '*', '123bbc', count=2) # **3bbc 加?表示非贪婪模式:最小范围匹配。进行了2次替换。
count
参数指定从左边起替换几次,默认为0
,表示全部替换;
另外sub
方法的第二个参数除了可以是字符串外,还可以是替换函数:
count
参数决定替换函数执行的次数。 import redef rep_f(matchObj): print matchObj.group() print matchObj.groups() return matchObj.group('group_b') #使用(?P...)给分组2指定了一个别名group_b,group函数可以接受别名参数,此处相当于group(2) print re.sub(r'(\d+)(?P b)', rep_f, '123bb234c123bbc123bbc', count=2)# 输出:# 123b# ('123', 'b')# 123b# ('123', 'b')# bb234cbbc123bbc
字符串分割:
import reprint re.split(r'\d+(b)', '123bb234c123bbc123bbc', 2)# ['', 'b', 'b234c', 'b', 'bc123bbc']
与参数1匹配模式中的分组匹配的字符串,会在分割后的返回值列表中出现;
参数3指定最大分割次数,也就是最多用几个能完整匹配参数1匹配模式的字符串分割。各个方法的原型:
re.match(pattern, string, flags=0) #返回值:匹配对象re.search(pattern, string, flags=0) #返回值:匹配对象re.findall(pattern, string, flags=0) #返回值:listre.sub(pattern, repl, string, count=0, flags=0) #返回值:str, replre.split(pattern, string, maxsplit=0, flags=0) #返回值:list
其中flags
标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。具体的:如re.I | re.M
被设置成 I
和 M
标志。
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |