大家好 这个部分我们介绍一下 简单的正则表达式 什么是正则表达式 简单来说它就是一种字符串的匹配模式 基于这个模式 可以从一个串或许多串当中 匹配或者是捕获也就是获取需要的字串 先来简单看一下 正则表达式的元字符和它的描述 比如说 这个点 它是用来匹配除了换行符以外的任意字符 要注意一下 是除了换行符 因为假设有的时候我们用 正则表达式去匹配一些网页源码的时候 那个网页源码当中如果有换行符 那就不能直接用这个点了 这时候就需要用到什么呢 用到\s 因为它可以匹配任意的空白字符 假设又有换行符又有其他的空格等等 我们就可以用什么呢 用这个符号即加号 就重复前面的子表达式1次或者多次 那就可以这样来写 其他的比如说[a-z] 这个也是非常常用的 就是匹配指定范围内的任意字符 假设要匹配任意不在指定范围内的字符 怎么办呢 只要加上这个元字符 说到这个 假设要匹配[0-9]这样的数字字符 那怎么办呢 只要这样写就可以了 当然 也可以用\d来匹配数字 除了这个以外其他比如说像这些比较常用 重复n次 n或者多次 n到m次等等 下面就以一个正则表达式验证的网站来举些例子 让大家能更好理解正则表达式的用法 这个是我比较常用的一个正则表达式验证的网站 当然这样的网站有很多 这个部分是这样的 下面是测试字符串 上面就是可以写上相应的正则表达式 如果有匹配 它这边会有显示 这个网站还会有一些类似手册一样的一些说明 比如说这些符号它背后 都会有说明到底是代表什么 开始也可以对这个网站做一些设置 比如说大小写是不是敏感 是不是多行模式等等 也就是可以检测多行等等 我们来先举一个很简单的例子 比如说我们有一个字符串hello 当然如果我完整地写出来 当然是可以匹配到这个字符串的 看到没有 1个match 这个是hello 假设写成这种形式 当然它就匹配不到了对不对 如果要再写hellllo 怎么匹配这个一长串的字符串呢 我们前面说过有一个符号加号 是不是可以重复前面的字符 也就是模式多次当然也可以是一次 可以看到是不是匹配上了 再长也OK嘛 这是第一个很简单的例子 下面再来写一个简单的句子吧 再来继续测试一下 比如说 “I am a test sentence. I have 500 books” 假设这样一个简单的句子 我要来匹配其中的单词或者是这样的数字字符串 怎么来匹配呢 我们来试一下 之前说过 这个形式 是不是匹配的是a-z这样的字符 我们看到 是不是产生了多个匹配a,m,t,e,s,t 这样一个一个的单个的 假设要匹配这些大写字符怎么办呢 是不是只要这样写[a-zA-Z] I就匹配成功了 如果要再匹配数字呢 [a-zA-Z0-9] 是不是都可以了 当然了 这个是一个字符 所以我们看到它是有多个匹配 假设把这个正则表达式改一下 要匹配长度为2的单词 怎么办呢 是不是可以这样写 看到了吧 am,te,st,se 但是这种针对我们这个例子不太实用 假设要把这些单词都匹配出来 是不是可以这样写 1到 到底多长呢 不知道 后面是不是可以空着 是不是就把这些单词匹配成功了 再进一步 假设只要匹配这个数字字符串 大家想一想 这怎么做呢 想到了吧 可以这样 0-9 是不是也可以 当然也可以把这个元字符串换成\d 是不是也一样的 其实这个数字我们也可以再想一想 假设句子里面有这样的浮点数 长度不知道 这种情况怎么匹配呢 大家想一想 是不是需要把这个点匹配出来 还有后面的这一串数字字符串 跟前面其实是一样的 因为点本身是一个元字符 所以用一个反斜杠表示 我们看到 是不是匹配成功了 如果在里面修改一下 通过这个大家是不是可以更进一步地 领略到“哇正则表达式真的是蛮强大的” 下面继续举一个跟数字有关的正则表达式的例子 比如说假设有一个IP地址 例如在一封E-mail里要获取其中的IP地址 怎么办呢 这边只是简单地来说一下IP地址的获取 就是说 不管它这个数字的范围 因为IP地址是这样子的 它有4个十进制数 每个范围是0-255 当然这里面还有一些细节的地方 中间是用.来分隔的 只是匹配3位长度的数字 还有.这样的格式 我们来写一下 自己先来想一下这个怎么写 首先\d 然后1-3位是不是{1,3}这样的方式 看下面测试字符串的变化 这时候它有4个match 然后. 同样的继续来写 看 是不是就是一个完整的match 就是这个IP地址 这样写 3 4 这样改变都是可以匹配的 看到这里面重复的部分比较多 有没有办法把这个重复的部分 用简略的方法把它写一下呢 这个是可以的 可以用这个括号把重复部分构成一个分组 一共是要重复3次 看是不是也是可以的 这边这个括号代表什么呢 它是代表把这个对象组成一个分组 也就是group 简单的功能就是说 它是可以把这整个当作一个整体 另外它还可以捕获其中的一个部分 我们看到这边 它会有一个返回134 什么什么 这边有说明 如果是一个重复的捕获的分组 它会捕获最后一次的迭代 第一次是192. 第二次是68. 第三次是134. 对吧 当然我们知道 其实这个分组是不需要的 只要这个全匹配 如果不捕获的话怎么办呢 也是可以的 可以这样子 然后是 看到组成了分组但是不捕获 我们要的是一个完整的IP地址 下面回到之前课程中 讲的这个点 星号 问号的问题 比如说来写一个字符串 简单一点吧 譬如说 hello hi haha hi haha 要匹配其中的hi 比如可以这样写 hello (.*?) haha 看到整个字符串就匹配上了 分组本身有捕获的功能 通过一定的方式 就可以拿到这个返回也就是hi 假设把这个问号删掉 这时候它获取的是什么呢 是hi haha hi 大家想为什么呢 想一想之前讲的 有问号它就是一种非贪婪的模式 如果没有问号 它是一种贪婪模式 有没有理解 也就是说现在不带问号 它会不断地在这个原始字符串里面找 直到找到最后一个空格haha 假设是加了问号以后 它是不是找到第一个空格haha就停下来了 这种就是非贪婪模式 大家现在理解了吧 在网页源代码里面很多时候 会用这种非贪婪的模式更多一些 除了这些情况以外最后再说一种 在做网页数据爬取的时候 经常会遇到的一种情况 比如说我们来看这个网站 假设需要抓取这四列数据 来看一下它的源代码 内容比较多的时候 一般会来搜索“USA”这个关键字 能看到它的实际的部分在这里 到这块结束 其他部分也是类似的 从这里到这里 观察一下 这几个源代码有没有发现有什么特征 第一个我们发现在这个位置 teams后面每个队这个名字是不一样的 另外看到这个后面其实都是有换行符的 所以来考虑一下这种情况 怎么样来写正则表达式 作为示例把这两段源代码拷到网站上面 怎么样来写这样的正则表达式的匹配的模式呢 首先 把它们完整地拷贝一下 当然这只是其中一种方式 这里要注意哈 因为这边我默认的是双引号 所以改成单引号 然后我们就在这些换行符后面加上\s+ 当然注意一下 这边可能有同学说 这匹配上了吗 但是你在正则表达式里面要写成 这样的方式是不好写的 对吧 你到底怎么样换行 所以这里都有自己固定的语法 我们看到第一个换行是在这个后面 \s+ 它们放在一行上 看到同样可以匹配整个字符串 然后接着做什么呢 把我们需要的地方用(.*?)来表示 看到获得了一二三四四个分组 但是因为USA这个部分并没有成功 为什么呢 就是刚才讲的这个地方 和这边的这个部分是不匹配的 这种情况怎么办呢 我们又不需要 但是它又有差异 是不是可以用通用的字符串 这种元字符的方式 把这个差异抵消掉 .*是不是就OK了 我们看到 是不是匹配就成功了 这种情况还是蛮常见的 这个就是正则表达式简单的入门介绍 大家有没有觉得 “哇!正则表达式真的还是蛮厉害的” 另外要说明一下 正则表达式不光用在网页数据的解析当中 日常的问题的处理 包括还有一些文本处理等等的 都是可以用正则表达式来解决的 有兴趣的小伙伴可以继续再深入地去挖掘一下