Python 爬虫正则表达式和re库,及re库的基本使用,提取单页面信息

正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索、替换、匹配验证都不在话下,正则表达式在所有编程里通用,所以不仅仅是python使用。

以下是常用的正则表达式,用的时候参考即可,不需要死记硬背,用得多了自然就熟悉了。

  • d :匹配任意数字,等价于 [0-9]
  • D :匹配任意非数字的字符,d的取反
  • w:代表字母,数字,下划线。也就是 a-z、A-Z、0-9、_。
  • W:代表不是字母,不是数字,不是下划线的。w的取反
  • n:代表一个换行
  • r :代表一个回车
  • f :代表换页
  • t :代表一个 Tab
  • s:代表所有的空白字符,也就是上面这个:n、r、t、f
  • S:代表所有不是空白的字符,s的取反
  • A :代表字符串的开始
  • Z:代表字符串的结束
  • ^ :匹配字符串开始的位置
  • $ :匹配字符串结束的位置
  • . :代表所有的单个字符,除了 n r
  • […] :代表在 [] 范围内的字符,比如 [a-z] 就代表 a到z的字母
  • [^…] :代表不在 [] 范围内的字符 ,[…] 的取反
  • {n} :匹配在 {n} 前面的东西,比如: o{2} 不能匹配 Bob 中的 o ,但是能匹配 food 中的两个o
  • {n,m} :匹配在 {n,m} 前面的东西,比如:o{1,3} 将匹配“fooooood”中的前三个o
  • {n,} :匹配在 {n,} 前面的东西,比如:o{2,} 不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o
  • * :和 {0,} 一个样,匹配 * 前面的 0 次或多次。 比如 zo* 能匹配“z”、“zo”以及“zoo”
  • + :和{1,} 一个样,匹配 + 前面 1 次或多次。 比如 zo+”能匹配“zo”以及“zoo”,但不能匹配“z”
  • ? :和{0,1} 一个样,匹配 ?前面 0 次或 1 次
  • a|b :匹配 a 或者 b
  • ():匹配括号里面的内容

1、python爬虫最常用组合

死记硬背,估计很难记住,很多人就不想学了。但是只要记住最常用的组合即可。

.*? 是我们在匹配过程中最常使用到的,表示的就是匹配任意字符。

\\d+ 匹配任意数字组合。

上面的 .*? 为什么不直接用 .* 而需要加个 ,这个涉及到贪婪还是非贪婪匹配。

2、贪婪还是非贪婪匹配

贪婪匹配:就是我们的第一段代码,一个数一个数都要去匹配,会尽可能多地去匹配内容。

非贪婪匹配:会尽量少的匹配符合条件的内容 也就是说,一旦发现匹配符合要求,立马就匹配成功,而不会继续匹配下去。

例子:

Python语言中的re模块拥有全部的正则表达式功能。

1、re.match函数

函数语法:

匹配成功re.match方法返回一个匹配的对象,否则返回None。

示例:

执行结果:

从例子中我们可以看出,re.match()方法返回一个匹配的对象,而不是匹配的内容。

通过调用span()可以获得匹配结果的位置。

而如果从起始位置开始没有匹配成功,即便其他部分包含需要匹配的内容,re.match()也会返回None。

2、分组捕获

以上可以看到返回的是匹配的对象,不是匹配的内容。

需要获取匹配的内容,我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

一般一个小括号括起来就是一个捕获组。我们可以使用group()来提取每组匹配到的字符串。

  • group(num=0): 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
  • groups(): 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

示例:

执行结果:

以上成功通过group捕获需要的词组和内容。

3、re.search()函数

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

示例:

执行结果:

以上,如果用re.match则无法匹配,因为正则表达式不符合字符串规范,会报错。

而用re.search,直接匹配整个字符串。找到第一个符合 \\d+ 的字符串100。

注:仅仅是匹配第一个符合的,所以只有100,后面的200不会匹配。

4、re.findall()函数

re.search可以直接匹配找到符合正则的字符串,但是仅仅是**第一个**符合的。

如果需要匹配全部的符合的,则用到re.findall()函数。

re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。

示例:

执行结果:

由于返回的是返回一个列表或元组,所以也不需要group来捕获。如果需要一个一个捕获,用res[0] 或res[1]来一个一个显示捕获的值。

5:re.sub()函数

检索和替换,Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

语法:

示例:

执行结果:

6:re.compile()函数

这个主要就是把我们的匹配符封装一下,这个也是很常用的一个函数。

表达式:

参数:

pattern : 一个字符串形式的正则表达式

flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:

  • re.I 忽略大小写
  • re.L 表示特殊字符集 \\w, \\W, \\b, \\B, \\s, \\S 依赖于当前环境
  • re.M 多行模式
  • re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
  • re.U 表示特殊字符集 \\w, \\W, \\b, \\B, \\d, \\D, \\s, \\S 依赖于 Unicode 字符属性数据库
  • re.X 为了增加可读性,忽略空格和 # 后面的注释

示例:

以上,我们可以先用re.compile把正则表达式封装,便于以后反复使用。封装后如下:

执行结果相同:

7、其他函数

re.finditer,和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

输出结果:

re.split,split 方法按照能够匹配的子串将字符串分割后返回列表。

示例:

执行结果

其他函数,具体用法可参考官方文档:https://docs.python.org/zh-cn/3/library/re.html

1、正则表达式分析

惯例,同样以豆瓣电影排行做分析,链接为:https://movie.douban.com/top250

查看源代码,简单点,我们提取4个信息即可。分别是排名序号、电影名称、导演演员、年份类型。

分析,所有信息在li标签中,所以首尾用在 li 标签中找就行了。需要的提取的信息,用()分组捕获就行。

1:第一个信息,排名序号,排名序号1在class></em之间。em是唯一的,比较简单。

2:第二个信息,电影名称,有很多地方,但是我们选个唯一明显不重复的,alt= 后面是标签里唯一的,整个标签里面就一个信息,所以这里比较简单,这时正则表达式为。

3:第三个信息,导演演员,在<p 标签里面,br>标签上方,这时正则表达式为。

4:第四个信息,年份类型,同理br>标签后方,</p结束,这个也很明显,最后的正则表达式为。

2、页面信息提取

正则表达式完成后,基本完成一大半了。现在简单提取相关信息。

这里用到两个库,re库正则表达式,和requests库抓取页面

执行结果,返回一个列表,还有\\n空格等,比较乱,类似如下:

3、列表去\\n空格

为了整洁,我们先抓取列表第一个数据 即 items[0] ,并去掉\\n和空格。

列表去除\\n,需要用到 strip() 函数, strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。但是该函数只支持字符串,不支持列表。所以需要用循环的方式。如下:

最后更改后的代码为:

执行结果这时候整洁多了:

4、循环提前整个页面信息

以上只有第一个信息,整个页面有很多信息,需要全部提取,并排列整齐,所以需要再次用到for循环,一列一列的显示出来。

最终代码为:

执行结果:

到这里,单个页面的信息就已经提取完成了,也算是完成了爬虫的一小步了。

jmeter(十五)-正则表达式提取器

sampler请求的服务器响应结果中通过正则表达式提取值所需值,生成模板字符串,并将结果存储到给定的变量名中。

界面如下:

正则表达式提取器界面

  • Apply to:作用范围(返回内容的断言范围)

1)Main sample and sub-samples:作用于主节点的取样器及对应子节点的取样器

2)Main sample only:仅作用于主节点的取样器

3)Sub-samples only:仅作用于子节点的取样器

4)JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称),从指定变量值中提取需要的值。

  • Field to check:要检查的响应报文的范围

1)主体:响应报文的主体,最常用

2)Body(unescaped):主体,是替换了所有的html转义符的响应主体内容,注意html转义符处理时不考虑上下文,因此可能有不正确的转换,不建议使用

3)Body as a Document:从不同类型的文件中提取文本,注意这个选项比较影响性能

4)Response Headers(信息头):响应信息头(

5)Request Headers:请求信息头

6)URL:请求url

7)Response Code(响应代码):响应状态码,比如200、404等

8)Response Message(响应信息):响应信息

  • 引用名称(Names of created variables):

Jmeter变量的名称,存储提取的结果;即下个请求需要引用方法是${变量名}。

  • 正则表达式(Regular Expression):

使用正则表达式解析响应结果,()括号表示提取字符串中的部分值,前后是提取的边界内容。

常用正则表达式:(.*?)表示匹配任意长度的任意字符,是最常用的正则表达式,基本能满足80%场景要求

  • 模板(Template):

正则表达式的提取模式。如果正则表达式有多个提取结果,则结果是数组形式,模板$1$,$2$等等,表示把解析到的第几个值赋给变量;从1开始匹配,以此类推。

若只有一个结果,则只能是$1$;有多个结果,可以使用$1$2$方式取2个值。

  • 匹配数字(Match No.(0 for Random)):

正则表达式匹配数据的结果可以看作一个数组,表示如何取值:

1)0代表随机取值,默认

2)正数n表示取第n个值,(1:第一个值

3)负数表示提取所有符合条件的值,(-1:所有

  • 缺省值(Default Value):

匹配不到值的时,取该值;

  • 使用空默认值(Use empty default value):

勾选后,提取不到值时,则返回空字符串。

1)主体(body)

2)Response Headers(信息头)

3)Request Headers:请求信息头

4)URL

5)Response Code(响应代码)和Response Message(响应信息)

正则表达式提取器如下:

测试结果:

调试取样器

使用变量,也可以通过变量名_g直接进行提取,如下:

正则表达式提取器

测试结果:

正式表达式:

备注:多个模板( $1$2$ )的时候,可以用空格、, 、. 、 – 连接模板

测试结果:

备注:在调试过程中可结果察看结果树和Debug sample来帮助分析结果。

超级厉害的提取函数——REGEXP正则函数(关于汉字部分)

在日常工作中,我们经常会遇到提取文本或者数字等,今天为大家介绍一个新函数—REGEXP正则函数,它的功能很强大,在提取时不需要嵌套其它函数,非常方便。

如图,我们需要根据要求,提取跟文字相关的信息,主要用到的正则表达式为:

[一-龟] 常用的汉字字符集

[一-龥] 所有汉字字符集

[一-龟]+ 任意汉字组成的一段连续字符集

[一-龟].+ 以汉字开头的所有字符集

[^一-龟] 非中文字符集

+ 表示出现一次或多次

  1. 提取第一个汉字前的内容

如图,我们需要提取第一个汉字前的内筒,在单元格中输入公式:=REGEXP(A2,\”^[^一-龟]+\”),公式中的第一个^,表示从字符串的开头提取;方括号中的^表示排除,[^一-龟]代表非中文字符,[^一-龟]+表示至少1个字符长的非中文字符。

2.提取除汉字外的部分

我们在单元格中输入公式:=REGEXP(A2,\”[^一-龟]+\”),这里的[^一-龟]+,表示所有的非中文字符,最后回车后得到提取结果。

3、提取第一个汉字起的内容

我们需要提取第一个汉字起的所有内容,在单元格中输入公式:=REGEXP(A2,\”[一-龟].+\”),[一-龟].+表示以汉字开头的字符集。

4、提取所有的文字内容

我们在单元格中输入公式:=REGEXP(A2,\”[一-龟]\”),或者=REGEXP(A2,\”[一-龥]\”)即可,[一-龥]+表示所有汉字。当我们不需要提取生僻字时,可以使用“[一-龟]+”,公式输入会更方便。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。