re.compile(pattern,flags)
把一个正则表达式pattern编译成正则对象,以便可以用正则对象的match和search方法,效率会有较大的提升
flags:
re.I | 忽略大小写 |
re.L | 影响 "w, "W,"b,和"B,这取决于当前的本地化设置。 配文字,但 "w只匹配字符类 [A-Za-z];它并不能匹配 "é"或 "?"。如果你的系统配置适当且本地化 设置为法语,那么内部的 C函数将告诉程 序 "é"也应该被认为是一个字母。当在编译正则表达式时使用 LOCALE标志会得 到用这些 C函数来处理 "w後的编译对象;这会更慢,但也 会象你希望的那样可以用 "w+来匹配法文文本。 |
re.M | 多行匹配,影响 ^和 $,指定了以后,'^'会增加匹配每行的开始(也就是换行符后的位置);'$'会增加匹配每行的结束 (也就是换行符前的位置) |
re.S | 影响'.'的行为,平时'.'匹配除换行符以外的所有字符,指定了本标志以后,也可以匹配换行符。 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W,\b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
查找:
re.match(pattern,string, flags)
如果字符串string的开头和正则表达式pattern匹配的话,返回一个相应的MatchObject的实例,否则返回None
属性:
1. string:匹配时使用的文本。
2. re: 匹配时使用的Pattern对象。
3. pos:文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
4. endpos:文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
5. lastindex:最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。
6. lastgroup:最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。
方法:
1. group([group1,…]):
获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。
2. groups([default]):
以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。
3. groupdict([default]):
返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。
4. start([group]):
返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。group默认值为0。
5. end([group]):
返回指定的组截获的子串在string中的结束索引(子串最后一个字符的索引+1)。group默认值为0。
6. span([group]):
返回(start(group), end(group))。
7. expand(template):
将匹配到的分组代入template中然后返回。template中可以使用\id或\g<id>、\g<name>引用分组,但不能使用编号0。\id与\g<id>是等价的;但\10将被认为是第10个分组,如果你想表达\1之后是字符'0',只能使用\g<1>0。
re.search (pattern, string, flags)
搜索整个字符串,返回实例对象
re.match(r'l','liuyan1').group() #返回l
re.match(r'y','liuyan1') #返回None
re.search(r'y','liuyan1').group() #返回y
re.findall(pattern,string, flags)
以列表的形式返回string里匹配pattern的不重叠的子串
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,flags)
将string里匹配pattern的部分,用repl替换掉,最多替换count次(剩余的匹配将不做处理),然后返回替换后的字符串。如果string里没有可以匹配pattern的串,将被原封不动地返回。repl可以是一个字符串,也可以是一个函数。如果repl是个字符串,则其中的反斜杆会被处理过,比如 \n 会被转成换行符,反斜杆加数字会被替换成相应的组,比如 \6表示pattern匹配到的第6个组的内容。
零长度的匹配也会被替换,比如:
>>> re.sub('x*', '-', 'abcxxd')
'-a-b-c-d-'
特殊地,在替换字符串里,如果有\g这样的写法,将匹配正则的命名组。\g这样的写法,也是数字的组,也就是说,\g<2>一般和\2是等效的,但是万一你要在\2后面紧接着写上字面意义的0,你就不能写成\20了(因为这代表第20个组),这时候必须写成\g<2>0,另外,\g<0>代表匹配到的整个子串。
>>> re.sub('-(\d+)-','-\g<1>0\g<0>', 'a-11-b-22-c')
'a-110-11-b-220-22-c'
re.subn(pattern,repl, maxspit, flags)
跟上面的sub()函数一样,只是它返回的是一个元组 (新字符串,匹配到的次数)
>>> re.subn('-(\d+)-','-\g<1>0\g<0>', 'a-11-b-22-c')
('a-110-11-b-220-22-c', 2)
re.split(pattern,string, maxsplit=0])
用匹配pattern的子串来分割string,如果pattern里使用了圆括号,那么 被pattern匹配到的串 也将作为返回值列表的一部分。如果maxsplit不为0,则最多被分割为maxsplit个子串,剩余部分将整个地被返回。
>>> 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', 'words, words.']
如果正则有圆括号,并且可以匹配到字符串的开始位置的时候,返回值的第一项,会多出一个空字符串。匹配到字符结尾也是同样的道理:
>>> re.split('(\W+)', '...words,words...')
['', '...', 'words', ', ', 'words', '...','']
注意,split不会被零长度的正则所分割,例如:
>>> re.split('x*', 'foo')
['foo']
>>> re.split("(?m)^$","foo\n\nbar\n")
['foo\n\nbar\n']