注意,split不会被零长度的正则所分割,例如:
>>> re.split('x*', 'foo')
['foo']
>>> re.split("(?m)^$", "foonnbarn")
['foonnbarn']
re.findall(pattern, string[, flags])
以列表的形式返回string里匹配pattern的不重叠的子串。string会被从左到右依次扫描,返回的列表也是从左到右一次匹配到的。如果pattern里含有组的话,那么会返回匹配到的组的列表;如果pattern里有多个组,那么各组会先组成一个元组,然后返回值将是一个元组的列表。
由于这个函数不会涉及到MatchObject之类的概念,所以,对新手来说,应该是最好理解也最容易使用的一个函数了。下面就此来举几个简单的例子:
#简单的findall
>>> re.findall('w+', 'hello, world!')
['hello', 'world']
#这个返回的就是元组的列表
>>> re.findall('(d+).(d+).(d+).(d+)', 'My IP is 192.168.0.2, and your is 192.168.0.3.')
[('192', '168', '0', '2'), ('192', '168', '0', '3')]
re. finditer(pattern, string[, flags])
和上面的findall()类似,但返回的是MatchObject的实例的迭代器。
还是例子说明问题:
>>> for m in re.finditer('w+', 'hello, world!'):
... print m.group()
...
hello
world
re.sub(pattern, repl, string[, count])
替换,将string里,匹配pattern的部分,用repl替换掉,最多替换count次(剩余的匹配将不做处理),然后返回替换后的字符串。如果string里没有可以匹配pattern的串,将被原封不动地返回。repl可以是一个字符串,也可以是一个函数(也可以参考我以前的例子)。如果repl是个字符串,则其中的反斜杆会被处理过,比如 n 会被转成换行符,反斜杆加数字会被替换成相应的组,比如 6 表示pattern匹配到的第6个组的内容。
例子:
>>> re.sub(r'defs+([a-zA-Z_][a-zA-Z_0-9]*)s*(s*):',
... r'static PyObject*npy_1(void)n{',
... 'def myfunc():')
'static PyObject*npy_myfunc(void)n{'
如果repl是个函数,每次pattern被匹配到的时候,都会被调用一次,传入一个匹配到的MatchObject对象,需要返回一个字符串,在匹配到的位置,就填入返回的字符串。
例子:
>>> def dashrepl(matchobj):
... if matchobj.group(0) == '-': return ' '
... else: return '-'
>>> re.sub('-{1,2}', dashrepl, 'pro----gram-files')
'pro--gram files'
零长度的匹配也会被替换,比如:
>>> re.sub('x*', '-', 'abcxxd')
'-a-b-c-d-'
特殊地,在替换字符串里,如果有g这样的写法,将匹配正则的命名组(前面介绍过的,(?P...)这样定义出来的东西)。g这样的写法,也是数字的组,也就是说,g<2>一般和2是等效的,但是万一你要在2后面紧接着写上字面意义的0,你就不能写成20了(因为这代表第20个组),这时候必须写成g<2>0,另外,g<0>代表匹配到的整个子串。










