8.零基础系统学习Python爬虫之正则表达式

在这里插入图片描述


正则表达式是一种匹配输入文本的模式。Net框架提供了允许这种匹配的正则表达式引擎。模式由一个或多个字符、运算符和结构组成正则表达式的本质还是一个字符串。作用就是在一个很大的文本内搜索某一个字段。

使用步骤

  1. 首先导入re库
  2. 建立函数result= re.findall("表达式",text)
  3. 表达式建立
  4. 返回result

元字符介绍

正则表达式就是由普通字符以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串

元字符作用表:
来源:IT-wanghanghang的博客

元字符 描述
@符号 正则表达式字符串前面加上@字符,这样不让编译器去解析其中的转义字符
*符号 *代表0-多个字符
\符号 \是转义字符. 是元字符,如果要表示一个\ . 字符的话,需要使用\ . *
| 将两个匹配条件进行逻辑“或”(Or)运算。
( ) 用小括号来指定子表达式(也叫做分组)
. 匹配除换行符以外的任意字符
\w 匹配字母、数字、下划线、汉字(指大小写字母、0-9的数字、下划线_)
\W \w的补集(除“大小写字母、0-9的数字、下划线_”之外)
\s 匹配任意空白符 (包括换行符/n、回车符/r、制表符/t、垂直制表符/v、换页符/f)
\S \s的补集 (除\s定义的字符之外)
\d 匹配数字(0-9数字)
\D 表示\d的补集(除0-9数字之外)
[ab] 匹配中括号中的字符
[a-c] a字符到c字符之间是字符
[ ^ x] 匹配除了x以外的任意字符
[ ^adwz] 匹配除了adwz这几个字符以外的任意字符
{n} 匹配前面的字符n次
{n,} 匹配前面的字符n次或多于n次
{n,m} 匹配前面的字符n到m次
? 重复零次或一次
+ 重复一次或更多次
* 重复零次或更多次

爬虫中re使用

在进行爬虫中正则表达式非常常用,下面我们就来看一下re在爬虫中的使用

首先来看一下匹配的示例:

f = '''
	I love you
	You love me
	He love me
'''
for line

Pattern 对象提供的一些常用方法:

  • findall 方法:全部匹配,返回列表
  • search 方法:从任何位置开始查找,一次匹配
  • match 方法:从起始位置开始查找,一次匹配
  • finditer 方法:全部匹配,返回迭代器
  • split 方法:分割字符串,返回列表
  • sub 方法:替换

findall方法

findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])
#string 是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始和终点位置

match 方法

match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])
'''match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果 
参数string表示字符串;pos表示下标,pos和endpos的默认值分别为0和len(string);参数flags用于编译pattern时指定匹配模式。
match方法是从字符串的pos下标处起开始匹配pattern,如果pattern结束时已经匹配,则返回一个Match对象;如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None
'''

当匹配成功时返回一个 Match 对象,其中:

  • group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group()
  • start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
  • end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
  • span([group]) 方法返回 (start(group), end(group))。

search 方法

re.search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])
'''参数string表示字符串;pos表示下标,pos和endpos的默认值分别为0和len(string));参数flags用于编译pattern时指定匹配模式
search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。
举个例子:
'''

finditer 方法

finditer 方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match 对象)的迭代器。

split 方法

split(string[, maxsplit])
''' 
split 方法按照能够匹配的子串将字符串分割后返回列表,其中,maxsplit 用于指定最大分割次数,不指定将全部分割。
'''

sub 方法

sub(repl, string[, count])
  • sub 方法用于替换,其中,repl 可以是字符串也可以是一个函数:
  • 如果 repl 是字符串,则会使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串,另外,repl 还可以使用 id 的形式来引用分组,但不能使用编号 0;
  • 如果 repl 是函数,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。
  • count 用于指定最多替换次数,不指定时全部替换

实战讲解

1.获取标签之间内容

该部分主要是通过正则表达式获取两个标签之间的内容,通常这种标签都是成对出现的。
开始标签如:、、、


后缀标签如:
、、、、、…
核心代码:
res_tr = r’(.*?)’
m_tr = re.findall(res_tr,language,re.S|re.M)
样例:

import re
 
language = '''<tr><th> name:</th><td> year:</td></tr><tr>'''
 
#正则表达式获取<tr></tr>之间内容
res_tr = r'<tr>(.*?)</tr>'
m_tr = re.findall(res_tr,language,re.S|re.M)

在这里插入图片描述

发布了40 篇原创文章 · 获赞 41 · 访问量 5925

猜你喜欢

转载自blog.csdn.net/qq_45172832/article/details/104266803