前面我们介绍了一些使用正则表达式的基础操作,但当我们需要创建的表达式比较复杂时,有没有一个好的方法帮助我们描述这些复杂的字符串模式呢?下面我们学习一下如何灵活的创建一些复杂的正则表达式吧!
1.匹配次数设置
(1) *匹配0次或多次 :c(learn)*c表示匹配的文本为 cc、clearnc、clearnlearnc..........................
(2)+匹配1次或多次 :c(learn)+c表示匹配的文本为 clearnc、clearnlearnc..........................
(3)?匹配0次或1次:c(learn)?c表示匹配的文本为cc、clearnc
(4){}匹配特定次数 :\d\d\d 可以表示为 \d{3};(\d\d\d)可以表示为(\d{3})
\d、\d\d、\d\d\d 三个合起来可以表示为(\d){1,3}表示匹配1-3次
2.贪心和非贪心匹配
举个例子,如果匹配模式为(c){3,5},,则如果文本中有ccccc,那么是会返回ccc、cccc还是ccccc呢?
python的正则表达式默认的是贪心匹配,即匹配最长的字符串,如果想转换成非贪心匹配,则需要在花括号后面加一个问号{}?
假设需要匹配的文本为‘我的编码为ccccc’, 若正则表达式为 (c){3,5},则输出结果为ccccc
若正则表达式为 (c){3,5}? 则输出结果为ccc
3.逻辑运算符
管道符 | :表示希望匹配许多表达式中的一个,如 r'cc|dd'表示匹配cc或者dd
4.建立自己的字符分类
有时候你想匹配一组字符,但缩写的字符分类\d \s \w太过宽泛,比如你想匹配aeoiu这几个元音字符,那么你可以用方括号[]建立自己的字符分类:
a = re.compile(r'[aeiouAEIOU]')
a.findall('aabbccddiieeooll') =======> ['a', 'a', 'i', 'i', 'e', 'e', 'o', 'o']
5.通配符
前面我们讲到,\d \s \w基本代表了所有类别的字符,但其实这三中表示形式可以用通配符代替,通配符就是一个句点. ,但需要注意的是,通配符.不包含换行符,如果要包含换行符,则需要在flag参数中设置为re.dotall
6.其他高级操作
(1)插入字符^:表明匹配必须发生在被查找文本的开始处,如构建正则表达式re.compile(r'^hello'),表示匹配的文本要以hello开始
(2)美元字符$:表明匹配必须发生在被查找文本的结束处,如构建正则表达式re.compile(r'\d$'),表示匹配的文本要以0-9的数字结束
以上都是构建复杂的正则表达式的一些方法,其实pattern对象不仅能查找到匹配的字符串,还可以对查找到的字符串进行替换,需要用到re.sub()函数,由于这个函数用起来可简单可复杂所以就不在本篇赘述,可以参考链接python re模块(正则表达式) sub()函数详解