正则表达式

re全称:Regular Expression,正则表达式,一种使用表达式的方式对字符串进行匹配的语法规则.

我们抓取到的网页源代码本质上就是一个超长的字符串,想从里面提取内容,用正则再合适不过了.

  • 正则优点:速度块,效率高,准确性高
  • 正则缺点:新手上手难度高

不过只要掌握了正则编写的逻辑关系,写出一个提取页面内容的正则其实并不复杂

元字符:具有固定含义的特殊符号

常用元字符:

.      匹配除换行符以外的任意字符, 除了\n 匹配不到
\w 匹配字母或数字或下划线 ,不要下划线 [a-zA-Z0-9]
\s 匹配任意的空白符
\d 匹配数字
\n 匹配一个换行符
\t 匹配一个制表符

^ 匹配字符串的开始
$ 匹配字符串的结尾

\W 匹配非字符或数字或下划线
\D 匹配非数字
\S 匹配非空白符
a|b 匹配字符a或字符b
() 匹配括号内的表达式,也表示一个组
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中字符的所以字符 (非)

量词:控制前面的元字符出现次数

*       重复零次或更多次
+ 重复一次或更多
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

贪婪匹配和惰性匹配

.*      贪婪匹配
.*? 惰性匹配

爬虫用的最多的就是惰性匹配

案例

str: 玩吃鸡游戏,晚上一起上游戏,干嘛呢?打游戏啊
reg: 玩.*?游戏
匹配的是: 玩吃鸡游戏

reg: 玩.*游戏
此时匹配的是: 玩吃鸡游戏,晚上一起上游戏,干嘛呢?打游戏

re模块

  1. findall 查找所有,返回list

    lst = re.findall('m', "mai le fo len, mai ni mei!")
    print(lst) # ['m', 'm', 'm']
    lst = re.findall(r'\d+', '5点之前,你要给我500万')
    print(lst) # ['5', '500']
  2. search 会进行匹配,但如果匹配到了第一个结果。就会返回这个结果,如果匹配不上search返回的则是 None

    ret = re.search(r'\d', '5点之前,你要给我500万')
    print(ret) # 5
  3. match 只能从字符串的开头进行匹配

    ret = re.match('a', 'abc').group()
    print(ret) # a
  4. finditer 和 findall 差不多,只不过这时返回的是迭代器(重点)

    it = re.finditer('m', "mai le fo len, mai ni mei!")

    for el in it:
    print(el.group()) # 依然需要分组
  5. compile 可以将一个长长的正则进行预加载. 方便以后使用

    obj = re.compile(r'\{3}')  # 将正则表达式编译成为一个正则对象,规定要匹配的3个数字
    ret = obj.search('abc123eee') # 正则表达式对象调用search,参数为待匹配字符串
    print(ret.group()) # 123
  6. 正则中的内容如何单独提取?