---恢复内容开始---
1.正则表达式元字符和使用方法:
#* 表示重复匹配前一个字符 0次到无限次:指定的字符出现0次到多次,意思是说,这个字符没有匹配上也算匹配成功,但结果为:''
#+ 表示重复匹配前一个字符 1 次到无限次:指定的字符出现1次到多次,意思是说,这个字符必须得有才能算匹配成功,
#匹配前一个字符:a* 表示*号前面的字符,也就是a
#直接匹配:'abc' >> 'abc' >结果:'abc'
符号 | 说明 | 使用案例 |
. | 通配符,匹配任意字符 | 'abc' > 'a.c' >>结果:'abc' |
*, +,? | 贪婪匹配(多吃字符):* 表示重复匹配前一个字符 0次到无限次,+ 表示重复匹配前一个字符 1 次到 无限次,'?' 表示重复匹配前一个字符0 到 1 次 | 'aaab' > 'a*' >>结果为: 'aaa' 'aaab' > 'a+' >>结果为:'aaa' 'abcccd' > 'abc?' >>结果为:'abc' |
*?,+?,?? | 非贪婪匹配,少吃字符 | 'abc' > 'abc*?' >>结果为: 'ab' 'abc' > 'abc+?' >>结果为:'abc' 'abcccd' > 'abc??' >>结果为:'ab' |
{m} | 匹配前一个字符m次 | 'abcccd' > 'abc{2}' >> 结果: abcc |
{m,n} | 匹配前一个字符m到n次 | 'abcccd' > "abc{1,3}" >>结果abccc |
{m,n}? | 匹配前一个字符m到n次,匹配最少的次数 | 'abccc' > 'abc{1,3}' >>结果 abc |
\ | 转义字符,对特殊字符进行转义 | 'a.c' > 'a\.c' > 结果 a.c |
[] | 字符集,特殊字符在里面都会失去特殊意义,但:^ , - , ], \ 有特殊含义 | 'abcd' > 'a[bc]d' >结果 :[] 'abcd' > 'a[bc]' >结果 :ab 'acbd' > 'a[bc]' >结果 :ac |
| | 或,注意:如果|没有在 ()内,则它的范围是整个正则表达式 | "abba" > "ab|ac" >结果: ab |
(....) | 被括号括起来的表达式作为一个分组 | 'qqa12s' > 'a(\d+)s' >结果:12 |
(?#...) | 忽略括号内的内容,特殊构建但不作为分组 | 'abcaaa123' >'abc(?#aaa123)123' |
(?=...) | 之后的字符串内容需要匹配表达式才能成功匹配 | 'abcjbzd' > 'abc(?=jbzd)' > abc 只匹配(?=...)之前的字符 |
(?!...) | 之后的字符串内容需要不匹配表达式才能成功匹配 | 'aa1' > aa(?!\d) > [] 'aad' > aa(?!\d) > aa |
(?<=..) | 之前的字符串内容需要匹配表达式才能算成功匹配 | '<aad' >> ' (?<=<)aa' > aa |
(?<!...) | 之前的字符串内容需要不匹配表达式才能算成功匹配 | 'ssadc' >> '(?<!\s)adc' > adc |
(?P=name) | 引用别名为<name>的分组匹配到的字符串 | |
(?:) | ()的不分组版本,用于使用 '|'或者后接数量词 | 'abcabc' > '(?:abc){2}' > 'abc', 'abc' |
预定义字符集(可以写在字符集中[....])
\d | 等同于:[0-9] | 'as123d' > '\d' >'1','2','3' |
\D | 匹配非数字,等同于[^\d] | 'a123d' > '\D' > 'a' , 'd' |
\s | 匹配空白字符:[\t\r\n\f\v],空格 | 'a c' > '\sc' > ' c' |
\S | 匹配非空白字符: [^\s] | 'abc' > '\Sc' > 'bc' |
\w | 匹配单词字符 [ a-zA-Z0-9_ ] | 'abc' > 'a\wc' > 'abc' |
\W | 匹配非单词字符 等同于 [^\w] | 'a.c' > '\wc' > '.c' |
匹配边界(不消耗待匹配字符串中的字符)
^ | 表示匹配字符串的开头,它以至少单个字符至整个字符串作为开头 | 'abc' > '^abc' >>结果: 'abc' 'abc' > '^a' >>结果:'a' |
$ | 匹配字符串末尾 | 'abc' > 'abc$' >>结果:'abc' 'abc' > 'c$' >>结果:'c' |
\A | 仅匹配字符串开头 | 'abc' > '\Aabc' >> 'abc' 'abc' > '\Ab' >> [] 'abc' > '\Aa' >> a |
\Z | 仅匹配字符串末尾 | 'abc' > 'abc\Z' >> 'abc' 'abc' > 'c\Z' >> 'c' 'abc' > 'b\Z' >> [] |
\b | 匹配\w和\W之间 | 'a!c' > '\b!c' >> '!c' |
Re模块:
re.I :忽略大小写
re.M :多行模式,改变'^'和'$'的行为
re.S :点任意模式
re.X :详细模式
re.complit(),生成一个正则表达式对象,然后调用正则表达式的相应方法。好处就是生成的正则对象可以多次使用
str1 = re.complit('\w')
str2 = str.match('abc')
#pattern:正则模型 ,string:字符串 , falgs:匹配模式
re.match(正则模型,字符串),从字符串的开始位置匹配,如果不是开始位置,匹配失败返回None
re.macth('tom','tom is 1.7 metres tall').group(0)
>>> tom
re.search(正则模型,字符串,匹配模式):从整个字符串内匹配,只要匹配成功第一次,就返回结果。否则,如果字符串没有匹配,返回None
X:match和search返回的是一个 match object对象,该对象有这么多个方法:
object.group(m,n) 返回组号所匹配的字符串,如果不存在,报indexError异常,默认为0
object.start() 返回匹配开始的位置
object.end() 返回匹配结束的位置
object.span() 返回一个元祖,记录匹配字符的 开始,结束 的位置
re.search('([a-z]*)([0-9]*)','aa12').group(0) > aa12
re.search('([a-z]*)([0-9]*)','aa12').group(1) > aa
re.search('([a-z]*)([0-9]*)','aa12').group(2) > 12
match和search的不同:
match只匹配字符串开头,而search从整个字符串内匹配,只匹配一次
#pattern:正则模型 ,string:字符串 , falgs:匹配模式
re.findall(正则模型,字符串,匹配模式),遍历匹配,只要字符串内的字符符合正则规则,返回一个列表
str1 = My name is chang quan egg 17 day
re.findall('\d',str1)
>>> ['1','7']
#pattern:正则模型 ,string:字符串 , falgs:匹配模式
re.finditer(),也是遍历匹配,但把成功匹配的字符串(match object)以迭代器返回
str1 = re.finditer('\d','day 952')
>>> <callable_iterator object at 0x0000016656F416A0>
for s in str1:
print(s) >>> <_sre.SRE_Match object; span=(4, 5), match='9'>
print(s.group()) >>> 9,5,2
print(s.span())
>>>(4(下标),5(位置))
re.split(pattern,string),字符串按照匹配规则进行分割,返回一个列表
re.split('\w','123s456b789')
>>> [123,456,789]
re.sub(pattern, repl,string,count) 符合匹配规则的string的子串进行替换,返回替换后的字符串
re.sub('\W','-',aa==bb==cc==hello')
>>> aa-bb-cc-hello
#替换次数
re.sub('\W','-',aa==bb==cc==hello',1)
>>> aa-=bb==cc==hello
总结:match,search,findall的不同:
match:只匹配字符串的开头,匹配失败返回NOne
search: 匹配整个字符串,匹配到第一个结果后,匹配结束
findall:遍历匹配,字符串内有多少符合正则规则的就匹配多少,返回一个列表
---恢复内容结束---