正则表达式——量词一般形式
根据上一章的介绍,可以用字符组[0-9]或者\d匹配单个数字字符。现在用正则表达式来验证更复杂的字符串,比如大陆地区的邮政编码。
粗略来看,邮政编码并没有特殊的规定,只是6位数字构成的字符串,比如201203、100858,所以用正则表达式来表示就是\d\d\d\d\d\d,如例2-1所示,只有同时满足"长度是6个字符"和"每个字符都是数字"两个条件,匹配才成功(同样,这里不能忽略^和$)。
例2-1 匹配邮政编码
re.search(r"^\d\d\d\d\d\d$", "100859") != None # => True re.search(r"^\d\d\d\d\d\d$", "201203") != None # => True re.search(r"^\d\d\d\d\d\d$", "20A203") != None # => False re.search(r"^\d\d\d\d\d\d$", "20103") != None # => False re.search(r"^\d\d\d\d\d\d$", "2012036") != None # => False
虽然这不难理解,但\d重复了6次,读写都不方便。为此,正则表达式提供了量词(quantifier),比如上面匹配邮政编码的表达式,就可以如例2-2那样,简写为\d{6},它使用阿拉伯数字,更简洁也更直观。
例2-2 使用量词简化字符组
re.search(r"^\d{6}$", "100859") != None # => True
re.search(r"^\d{6}$", "201203") != None # => True
re.search(r"^\d{6}$", "20A203") != None # => False
re.search(r"^\d{6}$", "20103") != None # => False
re.search(r"^\d{6}$", "2012036") != None # => False
量词还可以表示不确定的长度,其通用形式是{m,n},其中m和n是两个数字(有些人习惯在代码中的逗号之后添加空格,这样更好看,但是量词中的逗号之后绝不能有空格),它限定之前的元素 能够出现的次数,m是下限,n是上限(均为闭区间)。比如\d{4,6},就表示这个数字字符串的长度最短是4个字符("单个数字字符"至少出现4次),最长是6个字符。
如果不确定长度的上限,也可以省略,只指定下限,写成\d{m,},比如\d{4,}表示"数字字符串的长度必须在4个字符以上"。
量词限定的出现次数一般都有明确下限,如果没有,则默认为0。有一些语言(比如Ruby)支持{,n}的记法,这时候并不是"不确定长度的下限",而是省略了"下限为0"的情况,比如\d{,6}表示"数字字符串最多可以有6个字符"。不过,这种用法并不是所有语言中都通用的,比如Java就不支持这种写法,所以必须写明{0,n}。我推荐的做法是:最好使用{0,n}的记法,因为它是广泛支持的。表2-1集中说明了这几种形式的量词,例2-3展示了它们的使用。
表2-1 量词的一般形式
|
量词 |
说明 |
|
{n} |
之前的元素必须出现n次 |
|
{m,n} |
之前的元素最少出现m次,最多出现n次 |
|
{m,} |
之前的元素最少出现m次,出现次数无上限 |
|
{0,n} |
之前的元素可以不出现,也可以出现,最多出现n次(在某些语言中可以写为{,n}) |
例2-3 表示不确定长度的量词
re.search(r"^\d{4,6}$", "123") != None # => False
re.search(r"^\d{4,6}$", "1234") != None # => True
re.search(r"^\d{4,6}$", "123456") != None # => True
re.search(r"^\d{4,6}$", "1234567") != None # => False
re.search(r"^\d{4,}$", "123") != None # => False
re.search(r"^\d{4,}$", "1234") != None # => True
re.search(r"^\d{4,}$", "123456") != None # => True
re.search(r"^\d{0,6}$", "12345") != None # => True
re.search(r"^\d{0,6}$", "123456") != None # => True
re.search(r"^\d{0,6}$", "1234567") != None # => False

浙公网安备 33010602011771号