正则的part3:主要操作(python)
3.1 生成正则表达式对象(compile)
re.compile(pattern,flag=0)#原生代码
这个compile方法实际上是生成一个与pattern对应的正则表达式对象,以便于在以后的检索、匹配、分割登操作时重复生成,flag在这里没有什么特别的作用,下面我们就不讨论了。以下是操作示例
#其中r1的pattern为正则表达式‘1[2-9]{2}',一集即匹配第一个数字为1,后两个数字为2到9的字符串例如‘123'
r2 = re.compile('hello')
print(r1)
#输出re.compile('1[2-9]{2}')
print(type(r1))
print(r2)
#输出re.compile('hello')
print(type(r2))
#输出<class '_sre.SRE_Pattern'>
看起来还是有点难以理解对吧?没关系我们把这个正则表达式对象应用下去!
3.2 检索(search)
re.search(pattern,string)
这个方法是在string中检索是否有与pattern对应的子串,如果有则返回一个match'类型的对象,没有则返回none,现在我们来结合上面的compile方法进行示例演示,
r3 = re.search(r1,'abc123asd789')
print(r3)#输出<_sre.SRE_Match object; span=(3, 6), match='123'>
r4 = re.search(r2,'abc123asd789')
print(r4)#输出None,因为‘abc123asd789'中并没有hello
r5 = re.search(r2,'4we78hello23')
print(r5)#输出<_sre.SRE_Match object; span=(5, 10), match='hello'>
根据以上的方法演示,我们可以得出,如果string中有pattern匹配的子串,那么search方法将会返回一个match对象,其中会给出string中与pattern匹配的子串的下标,并且给出匹配的具体内容。如果没有,则会返回None值,此类对象也可以用于逻辑判断,判断string中是否有pattern匹配的子串等。
3.3 匹配(match)
re.match(pattern,string)
前面我们讲到了match对象,与match方法有一点点区别,match方法是检查,string中是否存在一个与pattern匹配的前缀,有则返回一个match对象,没有则返回None,我们采用示例来说明:
r6 = re.match(r1,'abc123asd189')
r7 = re.match(r1,'1239abc178123')
print(r6)#输出None
print(r7)#输出<_sre.SRE_Match object; span=(0, 3), match='123'>
可以看出,尽管字符串 ‘abc123asd189’和‘1239abc178123'中都有与r1匹配的子串,但是只有字符串‘123’是'1239abc178123'的前缀,所以只有r7输出了一个match对象
3.4分割(split)
re.split(pattern,string,maxsplit
分割方法以pattern作为分割串将string分段,并存入一个list,参数中的spilit表面最大分割数,当maxsplit = 0时,表示处理完整个字符串,以下是示例,其中的r2为以上生成的与‘hello’对应的正则表达式:
r8 = re.split(r2,'IhelloLOVEhelloPYTHONhello!',0)
print(r8)#输出['I', 'LOVE', 'PYTHON', '!']
r9 = re.split(r2,'IhelloLOVEhelloPYTHONhello!',1)
r10 = re.split(r2,'IhelloLOVEhelloPYTHONhello!',2)
print(r9)#输出['I', 'LOVEhelloPYTHONhello!']
print(r10)#输出'I', 'LOVE', 'PYTHONhello!']
可以看出,虽然string相同,但采用不同的maxsplit值,输出 的结果并不相同,字符串被分成了maxsplit+1个段,存入了list列表。
3.5 找出所有匹配串
re.findall(pattern,string)
此方法是返回一个表,表中给出可以匹配pattern的所有子串,前面已经有过关于手机号的正则示例了,这里才用r1 = re.compile('1[2-9]{2}'来演示findall方法:
r1 = re.compile('1[2-9]{2}')
r2 = re.findall(r1,'1239abc178555wer123')
print(r2)#输出['123', '178', '123']
print(type(r2))#输出<class 'list'>
通过示例可以看出,findall方法会直接返回匹配的子串,并且将子串存入一个列表。
而且不管子串是字符串的前缀、后缀还是包含于字符串中,findall方法都可以找到。
联系方式
如果有任何意见或者建议,欢迎发送邮件到我的邮箱:psywency@foxmail.com
比心❤️