正则表达式:用来做字符串匹配
贪婪匹配
贪婪匹配:在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
几个常用的非贪婪匹配:
*? 重复任意次,但尽可能少重复 +? 重复1次或更多次,但尽可能少重复 ?? 重复0次或1次,但尽可能少重复 {n,m}? 重复n到m次,但尽可能少重复 {n,}? 重复n次以上,但尽可能少重复
.*?的用法
. 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式。 何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用法为
.*?x 就是取前面任意长度的字符,直到一个x出现
re模块下的常用方法
findall 返回所有满足匹配条件的结果,放在列表里 ret = re.findall("[a-z]+", "ppd max zxc") print(ret) #['ppd', 'max', 'zxc'] finditer 用法同findall,返回迭代器
search 从前往后找,找到一个就返回,返回的变量需要调用group才能拿到结果 如果没有找到,那么返回None,调用group会报错 ret = re.search("zx", "ppd max zxc") if ret: print(ret.group()) #zx
match 从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个变量; 匹配的内容需要用group才能显示; 如果没匹配上,就返回None,调用group会报错 ret = re.match("pp", "ppd max zxc") if ret: print(ret.group()) #pp
ret = re.split("[ab]", "abcd") 先按a分割得到""和"bcd",再对""和"bcd"分别按b分割 print(ret) # ['', '', 'cd']
ret = re.sub("\d", "H", "ppd123ma45zxc", 1) 将数字替换成 H ,参数1表示只替换1个 print(ret) #ppdH23ma45zxc
ret = re.subn("\d", "H", "ppd123ma45zxc") 将数字替换成 H ,返回元组(替换的结果,替换了多少次) print(ret) #('ppdHHHmaHHzxc', 5)
#当正则规则较长且经常被使用的时候,使用compile obj = re.compile("\d{2}") 将正则表达式编译成为一个"正则表达式对象", 匹配的是3个数字 ret = obj.search("abc123qwer") 正则表达式对象调用search,参数为待匹配的字符串 print(ret.group()) #12