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 >'))