莫名想起一个笑话:阿基米德:给我一个杠杆,我能撬动地球。 金融人:喏,这个三倍杠杆借给你。 第二天开盘,阿基米德净亏两个地球。
上一次我们说到,简单点来讲,正则的使用可以包括两部分:
构建Pattern
处理返回的匹配
今天我们就来看一下如何构建不同的Pattern来表达我们所想要表达的内容。
就像盖房子需要砖瓦一样,我们想要构建不同的Pattern,也需要一些基础单元。这些基础单元用专业术语来讲,就是元字符。
就像是自然语言里会有单词,数字,量词一样,元字符也是分很多种。最常见的是:
\d: 匹配一个数字字符。等价于 [0-9][a-z]: 匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。[\u4e00-\u9fa5]:匹配中文\w: 匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。. :匹配除换行符以外的任意字符
上面这些元字符是用来表达单个字符的,如果要表达个数,可以使用下面的:
* : 匹配前面的子表达式零次或多次。例如,zo* 能匹配 'z' 以及 'zoo' : 匹配前面的子表达式一次或多次。例如,'zo ' 能匹配 'zo' 以及 'zoo',但不能匹配 'z'。? : 匹配前面的子表达式零次或一次。例如,'do(es)?' 可以匹配 'do' 或 'does' 。 {n}: n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 'Bob' 中的 'o',但是能匹配 'food' 中的两个 o。 {n,m}: m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,'o{1,3}' 将匹配 'fooooood' 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
把单个字符和数量的表达方式结合起来,我们就可以构建一些简单的pattern了。
例如:
如果要匹配2017-02-03这种日期方式,就可以用:
\d{4}-\d{1,2}-\d{1,2}
学爬虫的时候看到有不少人喜欢到网上抓图,如果要识别<img>标签,可以大概使用下面这个pattern:
<img src='. '.*>
当然,上面这个pattern随着具体情况还有待深究,我们也会提及。
在这里要注意的是,正则只是按照你给定的pattern进行匹配,而不会检测所匹配出的字符是否符合现实意义。举个例子,2017-13-15可以匹配\d{4}-\d{1,2}-\d{1,2}
,然而大家都知道这个日期肯定是不对的。
基本元字符
联系客服