一、group()和groups()方法
group()方法返回所有匹配对象或者是根据要求返回某个特定的子组。
groups()返回一个包含所有子组的元组。
例如:
m = re.match("([abc])+","abc") print m.groups() print m.group()
m.groups() 返回的只有(‘c’,)
m.group() 返回abc
一般,m.group(N) 返回第N组括号匹配的字符。
而m.group() == m.group(0) == 所有匹配的字符,与括号无关。
m.groups() 返回所有括号匹配的字符,以tuple格式。
m.groups() == ( m.group(1),…)
最后解释下,为什么m.group()返回的是c而不是a,因为有个+符号,执行一次或多次,这里会执行3次,返回最后一次的执行结果,所以是c
二、match()和search()匹配字符串
match()函数尝试从字符串的开头对模式进行匹配,如果匹配成功就返回一个匹配对象,如果匹配失败了,就返回None。
search()会检查字符串任意位置的地方给定正则表达式模式的匹配情况。
三、compile编译正则表达式
可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。下面是一个正则表达式对象的一个例子:
regex = re.compile("([abc])+") m = regex.match("abc") print m.group(1)
四、findall在字符串中搜索所有出现
因为match和search只会匹配一次,匹配到后就返回结果,所以想要匹配所有的时候就用到了findall。
>>> import re >>> s = "adfad asdfasdf asdfas asdfawef asd adsfas " >>> reObj1 = re.compile('((\w+)\s+\w+)') >>> reObj1.findall(s) [('adfad asdfasdf','adfad'),('asdfas asdfawef','asdfas'),('asd adsfas','asd')] >>> reObj2 = re.compile('(\w+)\s+\w+') >>> reObj2.findall(s) ['adfad','asdfas','asd'] >>> reObj3 = re.compile('\w+\s+\w+') >>> reObj3.findall(s) ['adfad asdfasdf','asdfas asdfawef','asd adsfas']
按以上代码例子讲解:
findall函数返回的总是正则表达式在字符串中所有匹配结果的列表,此处主要讨论列表中“结果”的展现方式,即findall中返回列表中每个元素包含的信息。
@1.当给出的正则表达式中带有多个括号时,列表的元素为多个字符串组成的tuple,tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应,并且排放顺序是按括号出现的顺序。
@2.当给出的正则表达式中带有一个括号时,列表的元素为字符串,此字符串的内容与括号中的正则表达式相对应(不是整个正则表达式的匹配内容)。
@3.当给出的正则表达式中不带括号时,列表的元素为字符串,此字符串为整个正则表达式匹配的内容。
五、finditer返回迭代器
>>> s=’111 222 333 444’ >>> for i in re.finditer(r’\d+’,s ): print i.group(),i.span() #打印每次得到的字符串和起始结束位置
结果是
111 (0,3) 222 (4,7) 333 (8,11) 444 (12,15)
re.finditer返回的是一个匹配对象的集合,相当于match多次,把多次结果组装成一个迭代器
六、split多个字符分割
python中字符串自带的split方法一次只能使用一个字符对字符串进行分割,但是python的正则模块则可以实现多个字符分割。
import re re.split('-|_','sharejs_haotu-icon100')
输出结果如下:
['sharejs','haotu','icon100']
七、sub/subn替换功能
sub和subn都是将某字符串中所有匹配正则表达式模式的部分进行替换,不同的是,subn还返回一个表示替换次数的数字,替换后的字符串和表示替换次数的数字作为一个元组的元素返回。
用来替换的部分通常是一个字符串,但也可能是一个函数,该函数返回一个用来替换的字符串。
re.sub共有五个参数。
其中三个必选参数:pattern,repl,string
两个可选参数:count,flags
- pattern:匹配模式
- repl:被替换的字符串
- string:要被替换的字符串
count:替换次数
>>> re.sub('[abc]','o','Mark') 'Mork'