匹配不到,则会返回错误。
2.“+” 匹配前一个字符一次或无限次 前一个字符(牢记,只是匹配前面一个)
>>> import re
>>> string = "naefda曾 LmKDS 1316547\n\t\r@@3$&^$"
>>> m = re.search("\w+",string)
>>> m.group()
'naefda曾'
>>> n = re.search("\s+",string)
>>> n.group()
' '
>>> d = re.search("更",string)
>>> d.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
从上面可以看出,"+"是匹配前一个字符一次或无限次,如果匹配不到,则返回None
3."?" 匹配前一个字符0次或一次 前一个字符(牢记,只是匹配前面一个)
>>> import re
>>> string = "naefda曾 LmKDS 1316547\n\t\r@@3$&^$"
>>> m = re.search("\w?",string)
>>> m.group()
'n'
>>> n = re.search("f?",string)
>>> n.group()
''
从上面可以看出,?是以贪婪的方式进行匹配。?是匹配前一个字符0次或1次。从上面的例子中发现一个问题,即"?"和"*"都是从头开始进行匹配,如果开头匹配不到,就返回"",等价于如果使用search()出现”?"和“*”等价于使用match()从头开始匹配,找不到则不找了,不一样的是match()返回的是None,而seach()返回的是""。
4.{m} 代表匹配前一个字符m次 前一个字符(牢记,只是匹配前面一个)
>>> import re
>>> string = "dafMM\n更1134657Qqcd m,l#!"
>>> m = re.search("\d{4}",string) #代表匹配数字四次
>>> m.group()
'1134'
>>> n = re.search("\d{10}",string)
>>> n.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
从上面可以看出,如果匹配不到,则返回None;{m}是代表匹配前一个字符m次,要注意在匹配的时候,我们可以像下面一样设定一个匹配区间,这样就不会出现匹配超标的情况。
5.{m,n} 匹配一个字符m次至n次 前一个字符(牢记,只是匹配前面一个)
m和n可以省略,如省略m({,n})则匹配0到n次;若省略n({m,}),则匹配m至无限次。
>>> import re
>>> string = "dafMM\n更1134657Qqcd m,l#!"
>>> m = re.search("\d{1,10}",string)
>>> m.group()
'1134657'
>>> n = re.search("\d{,5}",string)
>>> n.group()
''
>>> d = re.search("\d{4,}",string)
>>> d.group()
'1134657'
从上面可以看出,{m,n}是匹配在一个范围内的个数,但是我们也发现了一个问题,千万不要让正则表达式匹配包含0次的情况,一旦匹配0次,那么就会出现如果开头匹配不到之后,就不匹配的情况,直接返回""。
*? +? ?? {m,n}?使*,+,?,{m,n}变成非贪婪模式。
边界匹配
1.^ 匹配字符串开头,在多行模式中,匹配第一行的开头
>>> import re
>>> string = "dafMM\n更1134657Qqcd m,l#!"
>>> m = re.search("^da",string)
>>> m.group()
'da'
开头匹配,相当于使用match()进行匹配了。
2.$ 匹配字符串末尾,在多行模式中匹配每一行的末尾
>>> import re
&n