#正则学习网址:https://www.cnblogs.com/yuanchenqi/articles/5732581.html
正则表达式方法:
findall():所有结果都返回到一个列表里
search():返回匹配到的第一个对象(object),对象调用group()获取结果
match():只在字符串开始(即从第一个字符开始匹配)匹配,对象调用group()获取结果
print(re.match('asd', 'asdfff').group())//输出asd
print(re.match('asd', 'bbbasdfff').group())//匹配不上,不是开头匹配
split():指定分割符和分割集合["k","s"],先通过k分割完,在通过s分割其结果
print(re.split("s", "djsla"))//["dj", "la"]
print(re.split("[k,s]", "sdkbj"))//["", "d", "bj"]
sub():字符串替换,(匹配规则,替换结果,字符串,[替换次数])
print(re.sub('a..x', 's..b', 'hfjasal exxdhf'))//输出hfjasa..bxdhf
print(re.sub('\d', 'abc', '--2--3--',1))#输出['--abc--3--'],默认全替换,这里指定替换一次
print(re.subn('\d', 'abc', '--2--3--'))#输出['--abc--abc--',2]返回替换结果和替换次数
finditer:以迭代器的形式返回结果
ret = re.finditer('\d', 'ds34df343a')
print(next(ret).group())#输出 3
#======================== 正则特定字符 ============================
^ : 匹配开头,也表示取反
$ : 匹配结尾
[] : 范围匹配
[a-z] : 匹配有小写字母
[A-Z] : 匹配所有大写字母
[0-9] : 匹配所有数字
[^0-9]:匹配所有非数字
. : 匹配单个字符
* : 表示*前面的内容出现0次或多次
+ : 表示+前面的内容出现1次或多次
? : 表示?前面的内容出现0次或1次,惰性匹配
[0-9][a-z]*: 表示匹配一次数字,匹配0次或多次小写字母
cat a.txt | grep hat$ # 匹配以hat结尾的行
cat a.txt | grep ^hat # 匹配以hat开头的行
cat a.txt | grep -E "[0-9]*" # 匹配有0到多个数字的行
cat a.txt | grep -E "[0-9]+" # 匹配有至少有1个数字的行
cat a.txt | grep -E "[0-9]?" # 匹配有0到1个数字的行
#======================== 匹配集合 ============================
. :通配符,点号只能匹配任意的一个字符,但是不能匹配换行符\n
print(re.findall('w..l', 'hello world'))//输出['worl']
print(re.findall('w..l', 'hello wo\nld'))//输出[]
^ :匹配字符串开头,从第一个字符匹配,如果失败就不向后继续
print(re.findall('^h..o', 'hello world'))//输出['hello']
print(re.findall('^h..o', 'helly hello world'))//输出[],开头字符串y没匹配上就不在向后匹配
$ :匹配结尾
print(re.findall('a..x', 'hello alex world'))//输出['alex']
print(re.findall('a..x$', 'hello alex world'))//输出[]
print(re.findall('a..x$', 'hello alex world abcx'))//输出['abcx']
#======================== 匹配次数 ============================
* :贪婪匹配,匹配*号前的一个字符0次到多次
print(re.findall('ab*', 'hello aalex world'))//输出[""],没匹配到也会有一个空的单元
print(re.findall('al*', 'hello aallex world'))//输出["all",""]
+ :贪婪匹配,匹配+号前的字符一次到多次
print(re.findall('al+', 'hello aalex world'))//输出["al"],
print(re.findall('al+', 'hello aallex world'))//输出["all"],
? :惰性匹配,只匹配0次到一次
print(re.findall('a?b', 'eofaabfabcaddb'))//输出["ab","ab","b"]
{} :匹配指定次数,匹配两次{2},匹配1~3次{1,3},{1,}代表匹配1到无穷个,贪婪匹配
print(re.findall('a{2}b', 'eofaabfabcaddb'))//输出["aab"]
print(re.findall('a{1,2}b', 'eofaabfabcaddb'))//输出["aab","ab"]
#======================== 字符集 ============================
[]:字符匹配集合
1、[a,b,c],匹配字符串中出现的a,b,c和逗号中的一个字符,
print(re.findall('a[b,c,d]f', 'axf'))//输出[]
print(re.findall('[b,c,d]', 'bxcf'))//输出["b","c"]
print(re.findall('a[b,c,d]f', 'abf'))//输出["abf"]
print(re.findall('a[b,c,d]f', 'abdf'))//输出[]
print(re.findall('a[b,c,d, ]f', 'a f'))//输出["a f"], 匹配到d后的空格
print(re.findall('a[b-e]f', 'axf'))//输出[]
print(re.findall('a[b-e]f', 'axf'))//输出[]
print(re.findall("[a-z]","abc.f*d,"))//['a', 'b', 'c', 'f', 'd'],只能一个一个的匹配单字符
2、[a,*]:匹配字符a和普通字符*,取消匹配符的特殊功能,但是{\,^,-}这三个不能取消
print(re.findall('[a,*]', 'abf*'))//输出["a","*"]
print(re.findall("[a,*,.]","abc.f*"))//['a', '.', '*']
print(re.findall("[a,*,.,,]","abc.f*d,"))//['a', '.', '*', ','],匹配出了逗号
print(re.findall("[^t]","atf,"))//取反,取出^外的字符['a', 'f', ',']
print(re.findall("[^t,f]","atbf,"))//取反,不要t和f,注意逗号也消失,['a', 'b']
\:1、反斜杠后面跟匹配符取出特殊功,2、反斜杠后面跟普通字符有特殊功能
\d:匹配任何十进制数字,相当于数字[0-9]
print(re.findall("\d{11}","at128928928332233843487934bf"))//匹配手机号['12892892833', '22338434879']
\D:匹配任何非数字,相当于数字[^0-9]
\s:匹配任何空白字符,相当于数字[ \t\n\r\f\v]
print(re.findall("\sasd","at asd"))//['asd']
\S:匹配任何非空白字符,相当于数字[^ \t\n\r\f\v]
\w:匹配任何字母数字,相当于数字[0-9a-zA-Z_]
print(re.findall("\w","at bf"))//["a","t","b","f"]
\W:匹配任何非字母数字,相当于数字[^0-9a-zA-Z_]
\b:匹配一个特殊字符边界,也就是指单词和空格间的位置
print(re.findall(r"I\b","hello,I am a LIST"))//字母I后面有个空格,\b用来匹配边界,并不一定是空格,输出["I"]
print(re.findall(r"I\b","hello,I$am a LIST"))//美元符$也是一个特殊边界['I']
//search方法;匹配出满足条件的第一个结果
print(re.search('ak', 'faktakt').group()))//输出ak
print(re.search('a\.', 'fa.t').group()))//将点号转为普通点号匹配,输出a.
print(re.search('a\+', 'ga+t').group()))//将+号转为普通点号匹配,输出a+
匹配反斜杠:反斜杠在Python有特殊含义,所以Python中的反斜杠到正则中需要在加一个反斜杠,在传给正则处理就是正常的匹配了
print(re.search('\\\\', 'ab\cd').group()))//输出["\\"]
print(re.search(r'\\', 'ab\cd').group()))//输出["\\"]
():组匹配,将小括号中的整体作为单元进行匹配,小括号可以将匹配的结果筛选出来
print(re.search('www.(\w+).com', 'www.baidu.com').group()))//输出['baidu']
print(re.search('www.(?:\w+).com', 'www.baidu.com').group()))//输出['www.baidu.com'],?:方式取消只将匹配内容取出,
特殊用法:小括号内?P表示要命名匹配结果,名字用尖括号来存储,id和name与匹配结果构成key,value的形式
ret=re.search('(?P<id>\d{3})/(?P<name>\w{3})', 'weeew34ttt123/ooo')
print(ret.group())
print(ret.group("id"))
print(ret.group("name"))
|:管道符:作为 或 来匹配: a|3 ,匹配a或3
print(re.search('(bj)|3', 'abd3').group())//输出3
print(re.search('(bj)|3', 'abjd3').group())//输出bj