代码改变世界

正则表达式学习(2)

2017-06-21 18:36  很大很老实  阅读(157)  评论(0编辑  收藏  举报

1.可选项

  比如:[colou?r],对color和colour,都可以匹配。这里,u?中的?表示紧邻着它的前一个字符是可选的

 这里再举一个例子,7月4日的英文的额文本,7月,可以是July 也可以是Jul。我们可以写成[July|jul],但是,更简洁的写法是:[July?]

4日,可以是4,也可以是4th,也可以是fourth,所以,就是[fourth|4th|4],进一步简洁为[fourth|4(th)?],注意,这里的?就是作用于()里面的了

2.重复出现

[+]和[*]的作用和?类似。[+]表示紧邻的元素出现一次或者多次,而[*]表示之前紧邻的元素出现任意多次,或者不出现。

 

[+]和[*]和[?]这三个统称为量词,因为他们限定了匹配的次数。

 

我们来分析这段代码:

import re
mystr='<hr +size *= *[0-9]+ *>'
print(re.findall(mystr,'<hr      size   =14   >'))

这里分布分析:

1)hr和size之间,是有一个空格的,根据+表示,至少要有一个空格,多个也可以,因为在html语言中,hr和size必须要有空格。

2)=的左右两侧,可以有空格,也可以没有,也就是0到多个空格,这个时候,就是用*,而不能用=

3)[0-9]+表示有1个或者多个0到9之间的数字,最后一个*,很容易理解。

更进一步,在html中,实际上size这个也是可选的,比如<hr/>那就是使用缺省的size

import re
mystr='<hr( +size *= *[0-9]+)? *>'
print(re.match(mystr,'<hr   size  =    14   >').group(0))
print(re.match(mystr,'<hr>').group(0))

 

注意,这个时候,用findall是不对的,因为:

findall函数返回的总是正则表达式在字符串中所有匹配结果的列表,此处主要讨论列表中“结果”的展现方式,即findall中返回列表中每个元素包含的信息。

 

@1.当给出的正则表达式中带有多个括号时,列表的元素为多个字符串组成的tuple,tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应,并且排放顺序是按括号出现的顺序。

@2.当给出的正则表达式中带有一个括号时,列表的元素为字符串,此字符串的内容与括号中的正则表达式相对应(不是整个正则表达式的匹配内容)。

@3.当给出的正则表达式中不带括号时,列表的元素为字符串,此字符串为整个正则表达式匹配的内容。

 

而这里用match,也是起始位置开始匹配,如果匹配不到,就返回NONE,如果是如下代码,就出错了。

import re
mystr='王辰风    <hr( +size *= *[0-9]+)? *>'
print(re.match(mystr,'<hr   size  =    14   >').group(0))
print(re.match(mystr,'<hr>').group(0))

或者给成这样:

import re
mystr='(<hr( +size *= *[0-9]+)? *>)'
print(re.findall(mystr,'wcf <hr> <hr   size  =    14   >'))