Python之re模块
re模块
在Python中想要使用正则表达式,就需要调用re模块来实现。
在 re 模块下的常用方法:
调用时程序最上面需要写
import re
常用的几个关键字:
findall :re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
格式:re.findall(‘前面放要查找的内容’,‘这里放被查找的内容’)
search :re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
返回的变量需要调用group才能拿到结果 #,如果没有找到,那么返回None,调用group会报错。
格式:re.search(‘前面放要查找的内容’,‘这里放被查找的内容’)
match :决定RE是否在字符串刚开始的位置匹配。//注:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。
想要完全匹配,可以在表达式末尾加上边界匹配符'$'。
match是从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个变量。 匹配的内容需要用group才能显示 。 如果没匹配上,就返回None,调用group会报错。
格式: re.match(‘前面放要查找的内容’,‘这里放被查找的内容’)
compile : 只会从开头匹配,如果不是开头的字符串,那么将不会匹配成功。将正则表达式编译成为一个 正则表达式对象。
格式:re.compile
search : re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
格式:re.search(pattern, string, flags=0)
*注:match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:
- group() 返回被 RE 匹配的字符串
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span() 返回一个元组包含匹配 (开始,结束) 的位置
- group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
a. group()返回re整体匹配的字符串, b. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常 c.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。
finditer:搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。
格式 : re.finditer(pattern, string, flags=0)
split :按照能够匹配的子串将string分割后返回列表。可以使用re.split来分割字符串,如:re.split(r'\s+', text);将字符串按空格分割成一个单词列表。
格式:re.split(pattern, string[, maxsplit])
sub : 使用re替换string中每一个匹配的子串后返回替换后的字符串。
re.sub还允许使用函数对匹配项的替换进行复杂的处理。
如:re.sub(r'\s', lambda m: '[' + m.group(0) + ']', text, 0);将字符串中的空格' '替换为'[ ]'。
格式:re.sub(pattern, repl, string, count)
subn:返回替换次数。
格式:re.subn(pattern, repl, string, count=0, flags=0)
一些注意点:
1、re.match与re.search与re.findall的区别:
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
a=re.search('[\d]',"abc33").group() print(a) p=re.match('[\d]',"abc33") print(p) b=re.findall('[\d]',"abc33") print(b) 执行结果: None ['3', '3']
2、贪婪匹配与非贪婪匹配
*?,+?,??,{m,n}? 前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
a = re.findall(r"a(\d+?)",'a23b') print(a) b = re.findall(r"a(\d+)",'a23b') print(b) 执行结果: ['2'] ['23'] a = re.match('<(.*)>','<H1>title<H1>').group() print(a) b = re.match('<(.*?)>','<H1>title<H1>').group() print(b) 执行结果: <H1>title<H1> <H1>
a = re.findall(r"a(\d+)b",'a3333b') print(a) b = re.findall(r"a(\d+?)b",'a3333b') print(b) 执行结果如下: ['3333'] ['3333'] ####################### 这里需要注意的是如果前后均有限定条件的时候,就不存在什么贪婪模式了,非匹配模式失效。