本文文字较多,请大家耐心阅读。我保证,只要是从头到尾认真阅读完毕的,基本上百分之八十以上的正则表达式都可以看明白,至于速度,就在于你平常练习的水平了。
正则表达式
- 正则表达式用途
- 正则表达式基础
- 正则表达式例子讲解
正则表达式用途
1.写爬虫的时候对于网页内容的匹配
2.提取数据和替换数据
3.进行数据验证,比如某一字符串验证是否为手机号
基本上以上三种用途比较多。我学习它的原因就是为之后写爬虫打下基础。
正则表达式基础
- 特殊字符(后文有具体例子)
^ 表示需要匹配字符的开始或者作为非
$ 作为匹配字符串的结尾位置
() 子表达式的开始和结束位置
. 任何单一字符 除了\n
* 匹配前面的字符表达式零次或多次
+ 表示匹配前面的字符表达式一次或多次
?表示匹配前面的字符表达式零次或一次
\ 具有特殊用途 比如需要匹配字符\ 可以使用\
{ 具有限定作用
| 表示一个或的选择关系 a|b 既可以匹配a也可以匹配b
\b 表示匹配一个单词边界 即字与空格间的位置。
\B 非单词边界
\d 匹配一个数字字符
\D 匹配一个非数字字符
上面这些特殊的字符比较容易记混的就是*、+、?了,下面教给大家一个方法。0 * 任何一个数都为0,0+任何一个不为零的数都不是0,并且乘法和加法都可以使结果变得很大。 所以很轻松的就可以记住了 +和 *的区别了。
对于?,下面的点可以看成0,上面可以看作弯曲的1 所以只有0次和1次。
再补充一点,?与{0,1}等价 ,*与{0,}等价,+与{1,}等价 括号里面右边不写数字的话代表可以无限多。
上面基本上就是经常用到的特殊字符了,如果在后面的例子中出现别的字符,再进行介绍。
正则表达式例子五讲
- 匹配数字
目标匹配:0、0123、2343534
^[0-9]*$
这个规则可以匹配任何数字。
^ 和$ 作为开始和结尾,[0-9] 表示字符集合 范围是0-9,当然也可以写成
[0|1|2|3|4|5|6|7|8|9] 这两种形式是等价的 | 表示一种或的关系。*表示0或者很多 也就是对于前面的字符范围集合[0-9],可以进行0次或多次匹配。 这个规则我可以匹配到 0、01、1234、234145
- 匹配位数限制的数字
目标匹配:000、12、2345
2-4位的数字:^\d{2,4}$
上述可以匹配 位数在2-4位之间的数字,包括2和4.
\d 表示数字字符 相当于[0-9]
{} 具有限制作用 {2,4}表示前面表达式所匹配的2-4个字符
举一反三 :
匹配具有3-5个小写字母的字符 如何写呢?
^\w{3,5}$ 或者
^[a-z]{3,5}$
第一种方法能够匹配aaa 单同时也能够匹配000 不够严谨
第二种方法更加严谨一些。
- 贪婪和非贪婪字符的匹配
目标匹配:looo 和lo
输入 looo
lo+ 等效与 ^lo+$ 结果为 looo
lo+?等效与^lo+? 结果为lo
首先解释一下^ 和$对于表达式的具体作用。
^ 表示输入字符串开始的位置,也就是当我输入looo时,^表示第一个输入l的位置。
对于 $相似,表示输入字符串结束的位置,也就是looo的第三个o的位置。
加入这两个相当于就是指定了位置,不可以自由的从中间开始进行匹配
举个例子:
o+ 可以从looo 匹配到ooo
但是^o+ 就匹配不成功 原因是第一个字符是l,加入 ^必须从第一个字符开始。
同样的 o+? $ 只能匹配到000,而o+? 可以匹配到o ,原因是 $ 限制了字符串结尾的位置。
再解释一下?在这个例子中的作用。
这个例子中 ?的作用是使其前面表达式变得非贪婪。就是我能让你匹配到一个就不让你匹配到两个。正如上述例子中o+ 匹配为ooo 而 o+? 只能匹配到 o。
- 负值字符
目标匹配:s、c、l
输入:school
[scl] 结果输出 s、c、l
[^ho] 结果输出s、c、l
这里的^的作用与前面咱们说到的定位符的作用不一样,在这里,你可以把它理解为 非。 也就是除了ho 其他字符都可以进行匹配。
- 介绍两种特殊的模型
目标匹配:wall、well
输入:wall、well
w(?:all|ell) 等价与 wall|well 输出结果同上
w(?=all) 输出为 w 而这个w是wall的w 不是well的w
?:叫做非获取匹配,意思就是 括号里不进行数据存储,只是作为前面w字符后的一个匹配规则 ,整体输出为w加上里面匹配规则所匹配的字符。
?= 叫做正向肯定侦察 ,同时也是一个非获取匹配,但是输出与上面不一样,只是输出前面的w,括号里面只是作为前面w字符所在位置和哪个字符的规则。
当然还有反向肯定 反向否定 等等 具体可以查看菜鸟教程里面详细的介绍
菜鸟教程地址
如果有更好的例子,我也会及时更新上去。