1. 9.7 正则表达式与 re 模块
一个正则表达式就是一个用来表示某种模式的字符串。它能帮助你方便的检查一个字符串是否与某种模式匹配。
re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。 re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
要精通正则表达式并不容易,而且这本书的主题也不是正则表达式。 本节的目的是教会你在 Python中使用正则表达式。如果要全面的了解正则表达式,我推荐Jeffrey Friedl写的《Mastering Regular Expressions》这本书。这本书全面透彻的讲解了正则表达式的方方面面。
1.1. 9.7.1 模式字符串语法
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于'\\t')匹配相应的特殊字符。
表 9-2 列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。本节后面会提到这些可选的标志。 表 9-2 正则表达式模式语法
元素 含义. 匹配除换行外的任意字符(如果 DOTALL 则连换行也匹配)^ 匹配字符串开始(如果MULTILINE,也匹配换行符之后)$ 匹配字符串结束(如果MULTILINE,也匹配换行符之前)* 匹配0个或更多个由前面的正则表达式定义的片段,贪婪方式(尽可能多的匹配)+ 匹配1个或更多个由前面的正则表达式定义的片段,贪婪方式? 匹配0个或1个由前面的正则表达式定义的片段,贪婪方式*? , +?, ?? 非贪婪版本的 *, +, 和 ? (尽可能少的匹配){m,n} 匹配 m 到 n 次由前面的正则表达式定义的片段,贪婪方式{m,n}? 匹配 m 到 n 次由前面的正则表达式定义的片段,非贪婪方式[...] 匹配方括号内内的字符集中的任意一个字符| 等于 或(...) 匹配括号内的表达式,也表示一个组(?iLmsux) 设置可选参数的另类方式,不影响匹配(?:...) 类似 (...), 但是不表示一个组(?P...) 类似 (...), 但该组同时得到一个 id,可以在后面的模式中引用(?P=id) 匹配前面id组匹配的东西(?#...) 括号内的内容仅仅是注释,不影响匹配(?=...) Lookahead assertion; matches if regular expression ... matches what comes next, but does not consume any part of the string(?!...) Negative lookahead assertion; matches if regular expression ... does not match what comes next, and does not consume any part of the string(?(?\number 匹配先前匹配过的组(通过序号,组自动从1-99编号)\A 匹配字符串开始\b 匹配单词边界\B 匹配一个空串(非单词边界)\d 匹配任意数字\D 匹配任意非数字\s 匹配任意空白字符\S 匹配任意非空字符\w 匹配字母数字\W 匹配非字母数字\Z 匹配字符串结束\\ 匹配反斜杠
1.9.3. pattern
编译 r 使用的模式字符串
这些属性让你很容易的重新得到该对象被编译时使用的模式字符串和参数,再也不需要将它们保存到一个单独地方了了。
正则表达式对象 r 同样提供了很多方法来定位一个字符串中的正则表达式的匹配, 以便进行替换或其它操作,匹配通常由特殊对象表示, 9.7.10节会详细介绍.
1.9.4. findall 方法
r.findall(s)
当 r 没有分组时, findall 返回一个字符串列表, 每个字符串都是 s 中不重叠的 r 的匹配. 下面的例子演示了如何打印出一个文件中的所有单词: Toggle line numbers Toggle line numbers
1 import re 2 reword = re.compile(r'\w+') 3 for aword in reword.findall(open('afile.txt').read( )): 4 print aword
当 r 有一个分组时, findall 也返回一个字符串列表,列表中的每个字符串都是这个分组的匹配. 举例来说,如果你希望打印出所有的单词(不包括标点),你只需要在上面的例子里修改一个语句:
reword = re.compile('(\w+)\s')
当 r 有 n 个分组时 ( n > 1), findall 返回一个tuple的列表, 包括每一个不重叠的匹配. 每个tuple 有 n 个元素, 每个元素对应一个分组. 下面的例子打印出每行的第一个和最后一个单词(当然是匹配至少有两个单词的行). Toggle line numbers Toggle line numbers
1 import re 2 first_last = re.compile(r'^\W*(\w+)\b.*\b(\w+)\W*
1.9.5. match 方法
r.match(s,start=0,end=sys.maxint)
当匹配时,返回一个 match 对象,否则返回 None. 注意这个匹配严格的从字符串的 start 位置开始. 要在整个字符串中向前搜索匹配,使用 r.search 而不是 r.match. 下面的例子演示了如何打印出一个文件中所有以数字开头的行: Toggle line numbers Toggle line numbers
1 import re 2 digs = re.compile(r'\d+') 3 for line in open('afile.txt'): 4 if digs.match(line): print line,
1.9.6. search 方法
r.search(s,start=0,end=sys.maxint)
如果匹配成功,返回一个匹配最左边子串的 match 对象,否则返回 None.下面的例子演示了如何打印出含有数字的行: Toggle line numbers Toggle line numbers
1 import re 2 digs = re.compile(r'\d+') 3 for line in open('afile.txt'): 4 if digs.search(line): print line,
1.9.7. split 方法
r.split(s,maxsplit=0)
返回一个该匹配分隔的子串列表.举例来说,要排除一个字符串中所有的 'hello' 不区分大小写,可以这样: Toggle line numbers Toggle line numbers
1 import re 2 rehello = re.compile(r'hello', re.IGNORECASE) 3 astring = ''.join(rehello.split(astring))
如果 r 有多个分组,则分隔的规则就会象下面这样。下面这个例子只删除位于一个冒号(:)和数字之间的空白。 Toggle line numbers Toggle line numbers
1 import re 2 re_col_ws_dig = re.compile(r'(:)\s+(\d)') 3 astring = ''.join(re_col_ws_dig.split(astring))
这个例子可以说明更多问题:
>>> pat=r'(abc):(123)4(56)'>>> r=re.compile(pat)>>> s='aaabc:123456defghikabc:123456lll'>>> r.split(s)['aa', 'abc', '123', '56', 'defghik', 'abc', '123', '56', 'lll']
若 maxsplit 大于 0, 则至多进行 maxsplit 次分隔,剩下的部分则成为列表的最后一个元素。下面的例子只删除第一个匹配的'hello':
astring = ''.join(rehello.split(astring, 1))
1.9.8. sub 函数
r.sub(repl,s,count=0)
返回字符串s的一个拷贝,该串中的所有匹配均被替换成了 repl 。repl可以是一个字符串或一个可调用对象(函数或别的东西)。仅当不存在前一个匹配时,使用空的匹配(空串)替换. 当 count 大于 0 时, 只有前 count 个匹配被替换。若 count 等于 0, 所有的匹配都被替换. 下面的例子提供了删除目的字符串中第一次出现的 'hello' (不区分大小写)的另外一种方式: Toggle line numbers Toggle line numbers
1 import re 2 rehello = re.compile(r'hello', re.IGNORECASE) 3 astring = rehello.sub('', astring, 1)
如果例子中的 sub 方法没有最后一个参数, 则例子中的字符串 astring 中的所有 'hello' 均被删除。
若 repl 是一个可调用对象, repl 必须接受且仅接受一个 match 对象做为参数,并返回用来替换匹配的字符串。 sub 调用 repl, 并提供给 repl 一个合适的 match-object 参数, repl则为每个匹配返回一个替换值。还是举个例子表述的清楚,要将所有首字母为'h',末字母为 'o' 的匹配单词转化为大写,你可以这么做: Toggle line numbers Toggle line numbers
1 import re 2 h_word = re.compile(r'\bh\w+o\b', re.IGNORECASE) 3 def up(mo): return mo.group(0).upper( ) 4 astring = h_word.sub(up, astring)
在你不需要对匹配进行替换而是需要对这些匹配进行更复杂的处理时,sub 方法非常有用. 下面这个例子展示了 sub 方法的使用,它用来对一个没有分组的正则表达式生成一个类似 findall 方法的函数. Toggle line numbers Toggle line numbers
1 import re 2 def findall(r, s): 3 result = [ ] 4 def foundOne(mo): result.append(mo.group( )) 5 r.sub(foundOne, s) 6 return result
这个例子需要 Python 2.2 或更高, 不仅仅是因为它使用了嵌套作用域, 更大的原因是 Python 2.2 允许 repl 返回None并且视为其返回一个空串(). 而 Python 2.1则太轴,在Python2.1中,只允许 repl 返回一个字符串.
若 repl 是一个字符串而且它不是一个向后引用时, sub 使用 repl 自身作为替换.向后引用是一个 \g 形式的 repl 子串,这里 id 是 r 中一个分组的名字(由 r 中模式字符串中的 (?P) 建立), 或 \dd, 这里 dd 是一个或两个数字,代表一个分组的编号. 每个向后引用,不论是命名的还是编号的, 都被其所代码的匹配内容所替换.举例来说,下面这个将每个单词放入大括号中: Toggle line numbers Toggle line numbers
1 import re 2 grouped_word = re.compile('(\w+)') 3 astring = grouped_word.sub(r'{\1}', astring)
1.9.9. subn 函数
r.subn(repl,s,count=0)
subn 与 sub 相同, 只是 subn 返回一个元组 (new_string, n) ,这里 n 是 subn 替换的数字.看这个例子, 要统计子串'hello'出现的次数,一个方法是: Toggle line numbers Toggle line numbers
1 import re 2 rehello = re.compile(r'hello', re.IGNORECASE) 3 junk, count = rehello.subn('', astring) 4 print 'Found', count, 'occurrences of "hello"'
1.10. 9.7.10 Match 对象
正则表达式对象的 match 和 search 方法创建并返回 Match 对象. 当 repl 参数为可调用对象时, sub 及 subn 方法也会在幕后悄悄生成 Match 对象并使用.(在那种情况下一个相应的 match 对象被作为实参传递给 repl 对象.一个match 对象 m 支持以下属性:
pos 起始位置. 传递给 match 或 search 对象的开始位置参数(也就是字符串s开始匹配位置)
endpos 结束位置.传递给 match 或 search 对象的结束位置参数(也就是字符串s结束匹配位置)
lastgroup 最后匹配的分组的名字(或分组没有名字或根本没有匹配,返回None)
lastindex 最后匹配的分组的整数索引(从1开始). (如果没有匹配返回 None)
re 创建 m 对象的方法所属的正则表达式对象.
string 传递给方法 match, search, sub, 或 subn 的字符串 s
一个 match 对象也支持以下方法:
1.11.2. escape 函数
escape(s)
返回一个字符串s的拷贝,不过s中的所有非字母数字字符在新串中均已被转义(在其前面添加反斜杠)。
, re.MULTILINE) 3 if re.search(open('afile.txt').read()): print "some lines end with digits" 4 else: print "no lines end with digits"
模式 r'\d\n' 几乎与r'\d$'同义, 但是当一个文件以数字却没有回车结尾时,匹配将会失败。
1.9. 9.7.9 正则表达式对象
正则表达式对象 r 拥有下列只读属性, 这些属性详细描述了 r 是被如何创建出来的。 (通过模块 re 中的 compile 函数,见后文):
1.9.3. pattern
编译 r 使用的模式字符串
这些属性让你很容易的重新得到该对象被编译时使用的模式字符串和参数,再也不需要将它们保存到一个单独地方了了。
正则表达式对象 r 同样提供了很多方法来定位一个字符串中的正则表达式的匹配, 以便进行替换或其它操作,匹配通常由特殊对象表示, 9.7.10节会详细介绍.
1.9.4. findall 方法
r.findall(s)
当 r 没有分组时, findall 返回一个字符串列表, 每个字符串都是 s 中不重叠的 r 的匹配. 下面的例子演示了如何打印出一个文件中的所有单词: Toggle line numbers
___FCKpd___5
当 r 有一个分组时, findall 也返回一个字符串列表,列表中的每个字符串都是这个分组的匹配. 举例来说,如果你希望打印出所有的单词(不包括标点),你只需要在上面的例子里修改一个语句:
___FCKpd___6
当 r 有 n 个分组时 ( n > 1), findall 返回一个tuple的列表, 包括每一个不重叠的匹配. 每个tuple 有 n 个元素, 每个元素对应一个分组. 下面的例子打印出每行的第一个和最后一个单词(当然是匹配至少有两个单词的行). Toggle line numbers
___FCKpd___7
1.9.5. match 方法
r.match(s,start=0,end=sys.maxint)
当匹配时,返回一个 match 对象,否则返回 None. 注意这个匹配严格的从字符串的 start 位置开始. 要在整个字符串中向前搜索匹配,使用 r.search 而不是 r.match. 下面的例子演示了如何打印出一个文件中所有以数字开头的行: Toggle line numbers
___FCKpd___8
1.9.6. search 方法
r.search(s,start=0,end=sys.maxint)
如果匹配成功,返回一个匹配最左边子串的 match 对象,否则返回 None.下面的例子演示了如何打印出含有数字的行: Toggle line numbers
___FCKpd___9
1.9.7. split 方法
r.split(s,maxsplit=0)
返回一个该匹配分隔的子串列表.举例来说,要排除一个字符串中所有的 'hello' 不区分大小写,可以这样: Toggle line numbers
___FCKpd___10
如果 r 有多个分组,则分隔的规则就会象下面这样。下面这个例子只删除位于一个冒号(:)和数字之间的空白。 Toggle line numbers
___FCKpd___11
这个例子可以说明更多问题:
___FCKpd___12
若 maxsplit 大于 0, 则至多进行 maxsplit 次分隔,剩下的部分则成为列表的最后一个元素。下面的例子只删除第一个匹配的'hello':
___FCKpd___13
1.9.8. sub 函数
r.sub(repl,s,count=0)
返回字符串s的一个拷贝,该串中的所有匹配均被替换成了 repl 。repl可以是一个字符串或一个可调用对象(函数或别的东西)。仅当不存在前一个匹配时,使用空的匹配(空串)替换. 当 count 大于 0 时, 只有前 count 个匹配被替换。若 count 等于 0, 所有的匹配都被替换. 下面的例子提供了删除目的字符串中第一次出现的 'hello' (不区分大小写)的另外一种方式: Toggle line numbers
___FCKpd___14
如果例子中的 sub 方法没有最后一个参数, 则例子中的字符串 astring 中的所有 'hello' 均被删除。
若 repl 是一个可调用对象, repl 必须接受且仅接受一个 match 对象做为参数,并返回用来替换匹配的字符串。 sub 调用 repl, 并提供给 repl 一个合适的 match-object 参数, repl则为每个匹配返回一个替换值。还是举个例子表述的清楚,要将所有首字母为'h',末字母为 'o' 的匹配单词转化为大写,你可以这么做: Toggle line numbers
___FCKpd___15
在你不需要对匹配进行替换而是需要对这些匹配进行更复杂的处理时,sub 方法非常有用. 下面这个例子展示了 sub 方法的使用,它用来对一个没有分组的正则表达式生成一个类似 findall 方法的函数. Toggle line numbers
___FCKpd___16
这个例子需要 Python 2.2 或更高, 不仅仅是因为它使用了嵌套作用域, 更大的原因是 Python 2.2 允许 repl 返回None并且视为其返回一个空串(). 而 Python 2.1则太轴,在Python2.1中,只允许 repl 返回一个字符串.
若 repl 是一个字符串而且它不是一个向后引用时, sub 使用 repl 自身作为替换.向后引用是一个 \g 形式的 repl 子串,这里 id 是 r 中一个分组的名字(由 r 中模式字符串中的 (?P) 建立), 或 \dd, 这里 dd 是一个或两个数字,代表一个分组的编号. 每个向后引用,不论是命名的还是编号的, 都被其所代码的匹配内容所替换.举例来说,下面这个将每个单词放入大括号中: Toggle line numbers
___FCKpd___17
1.9.9. subn 函数
r.subn(repl,s,count=0)
subn 与 sub 相同, 只是 subn 返回一个元组 (new_string, n) ,这里 n 是 subn 替换的数字.看这个例子, 要统计子串'hello'出现的次数,一个方法是: Toggle line numbers
___FCKpd___18
1.10. 9.7.10 Match 对象
正则表达式对象的 match 和 search 方法创建并返回 Match 对象. 当 repl 参数为可调用对象时, sub 及 subn 方法也会在幕后悄悄生成 Match 对象并使用.(在那种情况下一个相应的 match 对象被作为实参传递给 repl 对象.一个match 对象 m 支持以下属性:
pos 起始位置. 传递给 match 或 search 对象的开始位置参数(也就是字符串s开始匹配位置)
endpos 结束位置.传递给 match 或 search 对象的结束位置参数(也就是字符串s结束匹配位置)
lastgroup 最后匹配的分组的名字(或分组没有名字或根本没有匹配,返回None)
lastindex 最后匹配的分组的整数索引(从1开始). (如果没有匹配返回 None)
re 创建 m 对象的方法所属的正则表达式对象.
string 传递给方法 match, search, sub, 或 subn 的字符串 s
一个 match 对象也支持以下方法:
1.11.2. escape 函数
escape(s)
返回一个字符串s的拷贝,不过s中的所有非字母数字字符在新串中均已被转义(在其前面添加反斜杠)。
, re.MULTILINE) 3 for first, last in first_last.findall(open('afile.txt').read( )): 4 print first, last
1.9.5. match 方法
r.match(s,start=0,end=sys.maxint)
当匹配时,返回一个 match 对象,否则返回 None. 注意这个匹配严格的从字符串的 start 位置开始. 要在整个字符串中向前搜索匹配,使用 r.search 而不是 r.match. 下面的例子演示了如何打印出一个文件中所有以数字开头的行: Toggle line numbers
___FCKpd___8
1.9.6. search 方法
r.search(s,start=0,end=sys.maxint)
如果匹配成功,返回一个匹配最左边子串的 match 对象,否则返回 None.下面的例子演示了如何打印出含有数字的行: Toggle line numbers
___FCKpd___9
1.9.7. split 方法
r.split(s,maxsplit=0)
返回一个该匹配分隔的子串列表.举例来说,要排除一个字符串中所有的 'hello' 不区分大小写,可以这样: Toggle line numbers
___FCKpd___10
如果 r 有多个分组,则分隔的规则就会象下面这样。下面这个例子只删除位于一个冒号(:)和数字之间的空白。 Toggle line numbers
___FCKpd___11
这个例子可以说明更多问题:
___FCKpd___12
若 maxsplit 大于 0, 则至多进行 maxsplit 次分隔,剩下的部分则成为列表的最后一个元素。下面的例子只删除第一个匹配的'hello':
___FCKpd___13
1.9.8. sub 函数
r.sub(repl,s,count=0)
返回字符串s的一个拷贝,该串中的所有匹配均被替换成了 repl 。repl可以是一个字符串或一个可调用对象(函数或别的东西)。仅当不存在前一个匹配时,使用空的匹配(空串)替换. 当 count 大于 0 时, 只有前 count 个匹配被替换。若 count 等于 0, 所有的匹配都被替换. 下面的例子提供了删除目的字符串中第一次出现的 'hello' (不区分大小写)的另外一种方式: Toggle line numbers
___FCKpd___14
如果例子中的 sub 方法没有最后一个参数, 则例子中的字符串 astring 中的所有 'hello' 均被删除。
若 repl 是一个可调用对象, repl 必须接受且仅接受一个 match 对象做为参数,并返回用来替换匹配的字符串。 sub 调用 repl, 并提供给 repl 一个合适的 match-object 参数, repl则为每个匹配返回一个替换值。还是举个例子表述的清楚,要将所有首字母为'h',末字母为 'o' 的匹配单词转化为大写,你可以这么做: Toggle line numbers
___FCKpd___15
在你不需要对匹配进行替换而是需要对这些匹配进行更复杂的处理时,sub 方法非常有用. 下面这个例子展示了 sub 方法的使用,它用来对一个没有分组的正则表达式生成一个类似 findall 方法的函数. Toggle line numbers
___FCKpd___16
这个例子需要 Python 2.2 或更高, 不仅仅是因为它使用了嵌套作用域, 更大的原因是 Python 2.2 允许 repl 返回None并且视为其返回一个空串(). 而 Python 2.1则太轴,在Python2.1中,只允许 repl 返回一个字符串.
若 repl 是一个字符串而且它不是一个向后引用时, sub 使用 repl 自身作为替换.向后引用是一个 \g 形式的 repl 子串,这里 id 是 r 中一个分组的名字(由 r 中模式字符串中的 (?P) 建立), 或 \dd, 这里 dd 是一个或两个数字,代表一个分组的编号. 每个向后引用,不论是命名的还是编号的, 都被其所代码的匹配内容所替换.举例来说,下面这个将每个单词放入大括号中: Toggle line numbers
___FCKpd___17
1.9.9. subn 函数
r.subn(repl,s,count=0)
subn 与 sub 相同, 只是 subn 返回一个元组 (new_string, n) ,这里 n 是 subn 替换的数字.看这个例子, 要统计子串'hello'出现的次数,一个方法是: Toggle line numbers
___FCKpd___18
1.10. 9.7.10 Match 对象
正则表达式对象的 match 和 search 方法创建并返回 Match 对象. 当 repl 参数为可调用对象时, sub 及 subn 方法也会在幕后悄悄生成 Match 对象并使用.(在那种情况下一个相应的 match 对象被作为实参传递给 repl 对象.一个match 对象 m 支持以下属性:
pos 起始位置. 传递给 match 或 search 对象的开始位置参数(也就是字符串s开始匹配位置)
endpos 结束位置.传递给 match 或 search 对象的结束位置参数(也就是字符串s结束匹配位置)
lastgroup 最后匹配的分组的名字(或分组没有名字或根本没有匹配,返回None)
lastindex 最后匹配的分组的整数索引(从1开始). (如果没有匹配返回 None)
re 创建 m 对象的方法所属的正则表达式对象.
string 传递给方法 match, search, sub, 或 subn 的字符串 s
一个 match 对象也支持以下方法:
1.11.2. escape 函数
escape(s)
返回一个字符串s的拷贝,不过s中的所有非字母数字字符在新串中均已被转义(在其前面添加反斜杠)。
, re.MULTILINE) 3 if re.search(open('afile.txt').read()): print "some lines end with digits" 4 else: print "no lines end with digits"
模式 r'\d\n' 几乎与r'\d$'同义, 但是当一个文件以数字却没有回车结尾时,匹配将会失败。
1.9. 9.7.9 正则表达式对象
正则表达式对象 r 拥有下列只读属性, 这些属性详细描述了 r 是被如何创建出来的。 (通过模块 re 中的 compile 函数,见后文):
1.9.3. pattern
编译 r 使用的模式字符串
这些属性让你很容易的重新得到该对象被编译时使用的模式字符串和参数,再也不需要将它们保存到一个单独地方了了。
正则表达式对象 r 同样提供了很多方法来定位一个字符串中的正则表达式的匹配, 以便进行替换或其它操作,匹配通常由特殊对象表示, 9.7.10节会详细介绍.
1.9.4. findall 方法
r.findall(s)
当 r 没有分组时, findall 返回一个字符串列表, 每个字符串都是 s 中不重叠的 r 的匹配. 下面的例子演示了如何打印出一个文件中的所有单词: Toggle line numbers
___FCKpd___5
当 r 有一个分组时, findall 也返回一个字符串列表,列表中的每个字符串都是这个分组的匹配. 举例来说,如果你希望打印出所有的单词(不包括标点),你只需要在上面的例子里修改一个语句:
___FCKpd___6
当 r 有 n 个分组时 ( n > 1), findall 返回一个tuple的列表, 包括每一个不重叠的匹配. 每个tuple 有 n 个元素, 每个元素对应一个分组. 下面的例子打印出每行的第一个和最后一个单词(当然是匹配至少有两个单词的行). Toggle line numbers
___FCKpd___7
1.9.5. match 方法
r.match(s,start=0,end=sys.maxint)
当匹配时,返回一个 match 对象,否则返回 None. 注意这个匹配严格的从字符串的 start 位置开始. 要在整个字符串中向前搜索匹配,使用 r.search 而不是 r.match. 下面的例子演示了如何打印出一个文件中所有以数字开头的行: Toggle line numbers
___FCKpd___8
1.9.6. search 方法
r.search(s,start=0,end=sys.maxint)
如果匹配成功,返回一个匹配最左边子串的 match 对象,否则返回 None.下面的例子演示了如何打印出含有数字的行: Toggle line numbers
___FCKpd___9
1.9.7. split 方法
r.split(s,maxsplit=0)
返回一个该匹配分隔的子串列表.举例来说,要排除一个字符串中所有的 'hello' 不区分大小写,可以这样: Toggle line numbers
___FCKpd___10
如果 r 有多个分组,则分隔的规则就会象下面这样。下面这个例子只删除位于一个冒号(:)和数字之间的空白。 Toggle line numbers
___FCKpd___11
这个例子可以说明更多问题:
___FCKpd___12
若 maxsplit 大于 0, 则至多进行 maxsplit 次分隔,剩下的部分则成为列表的最后一个元素。下面的例子只删除第一个匹配的'hello':
___FCKpd___13
1.9.8. sub 函数
r.sub(repl,s,count=0)
返回字符串s的一个拷贝,该串中的所有匹配均被替换成了 repl 。repl可以是一个字符串或一个可调用对象(函数或别的东西)。仅当不存在前一个匹配时,使用空的匹配(空串)替换. 当 count 大于 0 时, 只有前 count 个匹配被替换。若 count 等于 0, 所有的匹配都被替换. 下面的例子提供了删除目的字符串中第一次出现的 'hello' (不区分大小写)的另外一种方式: Toggle line numbers
___FCKpd___14
如果例子中的 sub 方法没有最后一个参数, 则例子中的字符串 astring 中的所有 'hello' 均被删除。
若 repl 是一个可调用对象, repl 必须接受且仅接受一个 match 对象做为参数,并返回用来替换匹配的字符串。 sub 调用 repl, 并提供给 repl 一个合适的 match-object 参数, repl则为每个匹配返回一个替换值。还是举个例子表述的清楚,要将所有首字母为'h',末字母为 'o' 的匹配单词转化为大写,你可以这么做: Toggle line numbers
___FCKpd___15
在你不需要对匹配进行替换而是需要对这些匹配进行更复杂的处理时,sub 方法非常有用. 下面这个例子展示了 sub 方法的使用,它用来对一个没有分组的正则表达式生成一个类似 findall 方法的函数. Toggle line numbers
___FCKpd___16
这个例子需要 Python 2.2 或更高, 不仅仅是因为它使用了嵌套作用域, 更大的原因是 Python 2.2 允许 repl 返回None并且视为其返回一个空串(). 而 Python 2.1则太轴,在Python2.1中,只允许 repl 返回一个字符串.
若 repl 是一个字符串而且它不是一个向后引用时, sub 使用 repl 自身作为替换.向后引用是一个 \g 形式的 repl 子串,这里 id 是 r 中一个分组的名字(由 r 中模式字符串中的 (?P) 建立), 或 \dd, 这里 dd 是一个或两个数字,代表一个分组的编号. 每个向后引用,不论是命名的还是编号的, 都被其所代码的匹配内容所替换.举例来说,下面这个将每个单词放入大括号中: Toggle line numbers
___FCKpd___17
1.9.9. subn 函数
r.subn(repl,s,count=0)
subn 与 sub 相同, 只是 subn 返回一个元组 (new_string, n) ,这里 n 是 subn 替换的数字.看这个例子, 要统计子串'hello'出现的次数,一个方法是: Toggle line numbers
___FCKpd___18
1.10. 9.7.10 Match 对象
正则表达式对象的 match 和 search 方法创建并返回 Match 对象. 当 repl 参数为可调用对象时, sub 及 subn 方法也会在幕后悄悄生成 Match 对象并使用.(在那种情况下一个相应的 match 对象被作为实参传递给 repl 对象.一个match 对象 m 支持以下属性:
pos 起始位置. 传递给 match 或 search 对象的开始位置参数(也就是字符串s开始匹配位置)
endpos 结束位置.传递给 match 或 search 对象的结束位置参数(也就是字符串s结束匹配位置)
lastgroup 最后匹配的分组的名字(或分组没有名字或根本没有匹配,返回None)
lastindex 最后匹配的分组的整数索引(从1开始). (如果没有匹配返回 None)
re 创建 m 对象的方法所属的正则表达式对象.
string 传递给方法 match, search, sub, 或 subn 的字符串 s
一个 match 对象也支持以下方法: