Python进阶之路 高级编程 正则表达式-重复、可选和特殊字符

重复、可选和特殊字符

正则表达式中最常见的就是匹配一些重复的字符串,例如,匹配3个连续出现的a(aaa符合要求),或匹配至少出现一个0的字符串(0、00、000都符合要求)。要对这种重复模式进行匹配,需要使用两个符号:"*""+"。其中,"*"表示字符串出现0次到n次,"+"表示字符串出现1到n次。

s = 'a*'	
strlist = ['','a','aa','baa']
for value in strlist:
    m = re.match(s,value)
    print(m)

在上面的代码中,a后面使用*进行修饰,这就意味着该模式会匹配0到n个a,也就是说,’’、‘a’、‘aa’、‘aaa’都可以匹配成功。所以很容易理解为什么strlist列表中前三个元素可以匹配成功。但是,为什么’baa’也可以匹配成功呢?这是因为'a*'可以匹配空串,而任何字符串都可以认为是以空串作为前缀的,所以’baa’只是空串的后缀,因此'a*'可以成功匹配’baa’。

s = 'a+'
strlist = ['','a','aa','baa']
for value in strlist:
    m = re.match(s,value)
    print(m)

如果对’a’使用"+"符号,就意味着’a’至少要出现1次,所以空串自然无法匹配成功,这就是’'和’baa’都无法匹配成功的原因。

前面的例子都是重复一个字符,如果要想将多个字符作为一组重复,需要用一对圆括号将这个字符串括起来。

s = '(abc)+'	
print(re.match(s,'abcabcabc')) 

除了"*""+"外,还有另外一个常用的符号"?",表示可选符号。例如,“a?“表示或者有a或没有a,即a可有可无。下面的代码利用"?"符号指定了匹配字符串的前缀和后缀,前缀可以是一个任意的字符或数字,而后缀可以是至少一个数字,也可以不是数字,中间必须是"wow”。在这里要引入两个特殊符号:”\w"和"\d"。其中"\w"表示任意一个字母或数字,"\d"表示任意一个数字。

import re

s = r'\w?wow(\d?)+'  
m = re.search(s,'awow')  
print(m)

m = re.search(s,'awow12')   
print(m)

m = re.search(s,'wow12')    
print(m)

m = re.search(s,'ow12') 
print(m)

m = re.search(s,'1wow') 
print(m)

输出结果:




None

[例 11.6] 本例通过在模式字符串中使用"+"``"*"``"?"符号以及特殊字符"\w"和"\d",演示了它们的不同用法。

import re

s = 'a+b+c+'    
strlist = ['abc','aabc','bbabc','aabbbcccxyz']

for value in strlist:
    m = re.match(s,value)
    if m is not None:
        print(m.group())
    else:
        print('{}不匹配{}'.format(value,s))

print('------------------------------------------')

s = r'\d{3}-[a-z]{3}'
strlist = ['123-abc','433-xyz','1234-xyz','1-xyzabc','543-xyz^%ab']

for value in strlist:
    m = re.match(s,value)
    if m is not None:
        print(m.group())
    else:
        print('{}不匹配{}'.format(value,s))

print('------------------------------------------')

s = r'[a-z]?\d+'
strlist = ['1234','a123','ab432','b234abc']

for value in strlist:
    m = re.match(s,value)
    if m is not None:
        print(m.group())
    else:
        print('{}不匹配{}'.format(value,s))

print('------------------------------------------')


email = r'\w+@(\w+\.)*\w+\.com'
emaillist = ['[email protected]','[email protected]','[email protected]','[email protected]']

for value in emaillist:
    m = re.match(email,value)
    if m is not None:
        print(m.group())
    else:
        print('{}不匹配{}'.format(value,email))

strVlues = '我的email是[email protected],请发邮件到这个邮箱'
m = re.search(email,strVlues)
print(m.group())


email = r'[a-zA-Z0-9]+@(\w+\.)*\w+\.com'
m = re.search(email,strVlues)
print(m.group())

输出结果:

abc
aabc
bbabc不匹配a+b+c+
aabbbccc
------------------------------------------
123-abc
433-xyz
1234-xyz不匹配\d{3}-[a-z]{3}
1-xyzabc不匹配\d{3}-[a-z]{3}
543-xyz
------------------------------------------
1234
a123
ab432不匹配[a-z]?\d+
b234
------------------------------------------
[email protected]
[email protected]
[email protected]不匹配\w+@(\w+\.)*\w+\.com
[email protected]
我的email是[email protected]
[email protected]

在本例中还用了一些特殊标识符,例如,[a-z]、[A-Z]、[0-9]是字母或关系的简写形式,分别表示26个小写字母(a~z)中的任何一个,26个大写字母(A-Z)中的任何一个,10个数字(0-9)中的任何一个。{N}形式表示前面修饰的部分重复N次,例如"(abc){3}“表示字符串"abc"重复3次,相当于"abcabcabc”。还有就是,如果要修饰多于一个字母的字符串,要用圆括号将字符串括起来,否则只会修饰{}花括号前面的一个字符,例如,"abc{3}“表示字母"c"重复3次,而不是"abc"重复3次,相当于"abccc”。

你可能感兴趣的:(Python,Python进阶之路,Python,正则表达式-重复,可选和特殊字符,高级编程,教程)