拓展:正则表达式-元字符

该部分为中谷教育Python视频教程的学习笔记

>>> import re

>>> 

>>> r = r'^abc'

>>> 

>>> re.findall(r,'abc')

['abc']

>>> re.findall(r,'aeabc')

[]

>>> re.findall(r,'^abc')        #如果我们要匹配'^abc',结果却是一个空集。

[]

#在上节课中提到^号在行首的意义是^号后面的字符串必须是行首位置

#^号作为元字符处理并不是一个普通的符号

>>> re.findall(r,'^abc ^abc ^abc')

[]

#如果我们的字符串里包含了若干个^abc,那么应该如何编写正则表达式呢?

#可以利用反斜杠转义:\

>>> r = r'\^abc'

>>> re.findall(r,'^abc ^abc ^abc')

['^abc', '^abc', '^abc']

#那么这里的反斜杠\就是这节课要提到的元字符

\反斜杠
反斜杠后面可以加不同的字符以表示不同特殊意义
也可以用于取消所有的元字符:\[或者\\ 
\d 匹配任何十进制数,相当于类[0-9]
\D 匹配任何非数字字符,相当于类[^0-9]
\s 匹配任何空白字符,相当于类[\t \n \r \f \v]
\S 匹配任何非空白字符,相当于类[^ \t\n\r\f\v]
\w 匹配任何字母数字字符,相当于类[a-zA-Z0-9_]
\W 匹配任何非字母数字字符,相当于类[^a-zA-Z0-9_]

>>> r = r'\d'

>>> re.findall(r,'123456784566487445')

['1', '2', '3', '4', '5', '6', '7', '8', '4', '5', '6', '6', '4', '8', '7', '4', '4', '5']

>>> r = r'\w'

>>> re.findall(r,'AdministratorSever')

['A', 'd', 'm', 'i', 'n', 'i', 's', 't', 'r', 'a', 't', 'o', 'r', 'S', 'e', 'v', 'e', 'r']

>>> r = r'\s'

>>> re.findall(r,'a b c d ')

[' ', ' ', ' ', ' ']

>>> r = r'\S'

>>> re.findall(r,'a b c d ')

['a', 'b', 'c', 'd']

重复:正则表达式第一个功能是能够匹配不定长的字符集,另一个功能就是可以指定正则表达式的一部分的重复次数

如北京电话号码格式为区号-电话号码如010-12345678

那么如何用正则表达式来匹配:

>>> r = r'^010-\d\d\d\d\d\d\d\d'    #有8个数字,因此写8个\d,如果数字多呢?如果要匹配128位的密钥?

>>> re.findall(r,'010-87654321')

['010-87654321']

>>> re.findall(r,'010-8765432')

[]

>>> r = r'^010-\d{8}' #{8}表示把前面的\d重复8次

>>> re.findall(r,'010-87654321')

['010-87654321']

>>> r = r'^010-a{8}' #{8}表示把前面的a重复8次

>>> re.findall(r,'010-aaaaaaaa')

['010-aaaaaaaa']

>>>

*星号
指定前一个字符可以被匹配零次或者更多次,而不是只有一次。匹配引擎会试着重复尽可能多的次数(不超过整数界定范围 20亿)
a[acd]*b  ---- 'abcbd'

>>> r = r'ab*'    #*号表示把b重复0次或者更多次

>>> re.findall(r,'ab')

['ab']

>>> re.findall(r,'abbbbbbbbbbbbbbb')

['abbbbbbbbbbbbbbb']

+号
表示匹配一次或更多次
注意*和+之间的不同,*匹配零或多次,所以可以根本就不出现,而+则要求至少出现一次。

>>> r = r'ab+'

>>> re.findall(r,'a')

[]

>>> re.findall(r,'ab')

['ab']

>>> re.findall(r,'abbbb')

['abbbb']

>>>

?号
匹配一次或零次,你可以认为它用于标识某事物是可选的。

#以电话号码为例,匹配电话号码有时候有人会写010-12345678,

#有些人会写01012345678那么这个-号是可选的,

#如何处理?看看用*号和用?号的区别

>>> r = r'^010-\d{8}$'

>>> r = r'^010-*\d{8}$'

>>> 

>>> re.findall(r,'01012345678')

['01012345678']

>>> re.findall(r,'010--12345678')

['010--12345678']

>>> r = r'^010-?\d{8}$'

>>> re.findall(r,'010--12345678')

[]

>>> re.findall(r,'010-12345678')

['010-12345678']

>>> re.findall(r,'01012345678')

['01012345678']

>>>

贪婪模式和非贪婪模式:

>>> r = r'ab+'

>>> re.findall(r,'abbbbbbb')        #贪婪模式,会做最大匹配

['abbbbbbb']

>>> r = r'ab+?'

>>> re.findall(r,'abbbbbbb')        #非贪婪模式,做最小匹配

['ab']

>>>

 

{m,n} 
其中m和n是十进制整数。该限定字符的意思是至少有m个重复,至多到n个重复。a/{1,3}b
忽略m会认为下边界是0,而忽略n的结果将是上边界为无穷大(实际上是20亿)
{0,}等同于*,{1,}等同于+,而{0,1}等同于?。如果就可以,最好使用*,+或者?号

>>> r = r'a{1,3}'

>>> re.findall(r,'a')

['a']

>>> re.findall(r,'b')

[]

>>> re.findall(r,'aa')

['aa']

>>> re.findall(r,'aaa')

['aaa']

>>> re.findall(r,'aaaa')

['aaa', 'a']

>>> re.findall(r,'aaaaaaaaaaaaa')

['aaa', 'aaa', 'aaa', 'aaa', 'a']

>>>

你可能感兴趣的:(正则表达式)