python中的一些细节

一.正则表达式

1.注意()()*和()+使用上的一点差异

a = re.compile(r'Hello(wo)(wo)*world')
b = re.compile(r'Hello(wo)+world')
c = re.compile(r'Hello(wo){1,}world')
#c和b的效果相同,且在group上也是相同的

a和b的功能都是匹配以Hello开头和以world结,且这两者之间连接部分是1个或者多个wo的串,但是用他们匹配的结果在分组上是有区别的:

a1 = a.search('Hellowoworld')
a2 = a.search('Hellowowowoworld')
a1.group(1)
a1.group(2) == None
a1.group(3)
a2.group(1)
a2.group(2)
a2.group(3)

结果为:
'wo'
True
IndexError: no such group
'wo'
'wo'
IndexError: no such group

b1 = b.search('Hellowoworld')
b2 = b.search('Hellowowowoworld')
b1.group(1)
b1.group(2) == None
b1.group(3)
b2.group(1)
b2.group(2)
b2.group(3)

结果为:
'wo'
IndexError: no such group
IndexError: no such group
'wo'
IndexError: no such group
IndexError: no such group

可以发现,在匹配的时候,尽管a与b的中间部分都是至少匹配一个wo,若是0个则search方法匹配失败,返回NoneType类型对象None,如果匹配成功,使用a时返回的一定是两个分组group,使用b的时候返回的一定是一个分组group,对于a这种()()*的方式,第一个括号返回一个分组,第二个括号后面加上*,返回的分组可以是None(NoneType类型),也可以是匹配上的内容,对于b这种()+,返回的一定只有一个分组,有且仅有一个,不可能为None(因为()+至少匹配一个)。

小结:对于同样的内容x,(x)(x)*和(x)+在正则表达式中匹配的功能是一样的,但是在分组group上有差别,前者一定是2个group,后者一定是1个group,前者的第一个group和后者的group内容一样,都为x,前者的第二个group要么也是x(匹配至少2个连续x的时候),要么是None(匹配只有1个连续x的时候)。c和b的效果完全相同,包括group。

 

未完待续...


版权声明:本文为hhm853610070原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。