爬虫必学知识之正则表达式上篇

这是日常学python的第12篇文章

在向网页进行了提交请求之类的之后,我们可以得到了网页的返回内容,里面自然而然会有我们想要的数据,但是html元素文本这么多,我们不可能一 一去找我们需要的数据,这时就需要用到正则表达式了,正则表达式是学爬虫必须学的内容,而且不止python可以用,java等其他语言都可以用,所以学了好处大大。

什么是正则表达式?

正则表达式就是一个特殊的字符序列,可以用于检测一个字符串是否与我们的所设定的字符串相匹配。功能有快速检索文本和快速替换一些文本的操作。

python里面有个处理正则表达式的库 re。有个方法

findall(pattern,string,flags)

用来匹配正则达式,我们就先用这个方法处理下。

参数如下:

  • pattern:正则表达式
  • string:要进行匹配的字符串
  • flags:匹配的模式

结果是一个匹配内容的列表

'\d' : 这个表示匹配单个0-9数字

'\D' : 与\d相反,匹配数字以外的内容

用代码来感受下:

import re#这个库是用来使用正则表达式的
a='sg+sga5g45gaae3f23hgt13'
r=re.findall('\d',a)#这个就是根据\d的正则表达式来查找对应字符,其中\d是对应0-9的数字
#查找非数字用\D
r1=re.findall('\D',a)
print(r)
print(r1)
#结果
['5', '4', '5', '3', '2', '3', '1', '3']
['s', 'g', '+', 's', 'g', 'a', 'g', 'g', 'a', 'a', 'e', 'f', 'h', 'g', 't']

可以看到找出了字符串中的数字和非数字

本文出自公众号「日常学python」

如果我们在匹配一个字符串时,中间内容是有多个变化的,我们需要应变多种不同的字符,如这个字符串

a='abc,acc,agc,anc,afc,adc,aec'

如果需要匹配这个字符串时,我们就需要用到 [ ] ,用中括号括起来的字符,里面的内容表示或关系,那来看看代码

import re
a='abc,acc,agc,anc,afc,adc,aec'
#现在查找上面的中间字符为c或者f的字符串
#这个要求可以用到字符集来实现
r=re.findall('a[cf]c',a)#[]表示字符集,里面的内容是或关系
# 结果
['acc', 'afc']

上面匹配了中间字符是c或者是f的字符串,匹配中间字符非c和非f,可以在前面加个 ^ 符号

import re
r=re.findall('a[……cf]c',a)#[c-f]就是表示从c到f
print(r)
# 结果
['abc', 'agc', 'anc', 'adc', 'aec']

上面只处理了中间字符为chu者f的字符串,但是没有匹配全部的,若要匹配全部,可以加个 - 符号,表示范围,如下

import re
r=re.findall('a[b-n]c',a)#[c-f]就是表示从c到f
print(r)
# 结果
['abc', 'acc', 'agc', 'anc', 'afc', 'adc', 'aec']

[b-n]:这个就是表示b到n的字符

匹配汉字:[\u4E00-\u9FA5]

概括字符集:

用一个 \ + 字母 表示一系列的字符的元字符,只能匹配单个字符,常用的如下

  • \w:匹配数字和字符「不包括&符号」只匹配单词,数字和下划线
  • \W:与\w相反,这个包括空格和回车
  • \s:匹配空格字符,如空格,回车和制表符
  • \S:与\s相反
  • .:匹配除换行符之外的其他字符
  • 还有前面的\d\D也是

有个小技巧:如果想要匹配所有字符,就可以把上面的两个相反的合并起来就可以了。

代码如下:

#概括字符集,就是用一个\加个字母来表示一类字符,比如刚开始的\d,\D
import re
a='hdsk\n122\rs3$ dkl%df36\t5&'
r=re.findall('\w',a)#这个是匹配数字和单词
print(r)
#也可以匹配非数字非单词
r=re.findall('\W',a)
print(r)
#匹配空格字符和制表符等其他字符
r=re.findall('\s',a)
print(r)
#匹配除换行符之外的其他字符
r=re.findall('.',a)
print(r)
# 结果
['h', 'd', 's', 'k', '1', '2', '2', 's', '3', 'd', 'k', 'l', 'd', 'f', '3', '6', '5']
['\n', '\r', '$', ' ', '%', '\t', '&']
['\n', '\r', ' ', '\t']
['h', 'd', 's', 'k', '1', '2', '2', '\r', 's', '3', '$', ' ', 'd', 'k', 'l', '%', 'd', 'f', '3', '6', '\t', '5', '&']

数量词:

当一个字符需要连续重复匹配多次时,就要用到这个。如匹配三个字符组成的字符串:

[a-zA-z]{3} ,大括号里面的表示重复次数。

若要匹配三到六个字符,大括号的就需要这样写:{3,6}.

代码如下;

#数量词,当一个字符需要多次重复匹配时就需要用到
import re
a='python java111php23 html'
r=re.findall('[a-z]{3}',a)#重复多次就用大括号,括号内的数表示重复的次数
print(r)
#也可以重复一个范围,表示匹配3到6个字符
r=re.findall('[a-z]{3,6}',a)
print(r)#这样就可以把单词都找出来了
# 结果
['pyt', 'hon', 'jav', 'php', 'htm']
['python', 'java', 'php', 'html']

其他数量词表示:

  • * :匹配零次或无限多次
  • +:匹配一次或以上
  • ?:匹配零次或者一次
a='pytho243python34pythonn'
#*表示匹配对应内容0次或者无限次
r=re.findall('python*',a)#这个就是代表对n字符的数量词匹配
print(r)
#+表示匹配内容1次或者无限次
r=re.findall('python+',a)
print(r)
#?表示可以匹配0次或者1次,注意这个?和上面的非贪婪代表的意思不一样
r=re.findall('python?',a)
print(r)
# 结果
['pytho', 'python', 'pythonn']
['python', 'pythonn']
['pytho', 'python', 'python']

贪婪匹配:正则表达式默认为贪婪匹配,即匹配符合字符串的最大长度,如上面的[a-zA-z]{3,6},他会趋于匹配长度为6的字符串,匹配到条件不满足时才停止匹配。

非贪婪匹配:就是趋于匹配长度最小的字符串,匹配满足第一个条件就会停止匹配

r=re.findall('[a-z]{3,6}',a)# 贪婪匹配
print(r)
r=re.findall('[a-z]{3,6}?',a)
print(r)#由于是非贪婪,所以匹配当第一个条件满足时就停止匹配
# 结果
['python', 'java', 'php', 'html']
['pyt', 'hon', 'jav', 'php', 'htm']

END

这篇文章只是介绍了下正则表达式的简单用法,可以用来入门正则,下一篇文章讲正则表达式高级点的用法。

留个小练习:写一个正则来匹配生日,字符串为:

  • 2005-06-09
  • 2005-6-9
  • 2005 6 9
  • 2005,06,09

可以把答案写在留言区哈!

上述文章如有错误欢迎在留言区指出,如果这篇文章对你有用,点个赞,转个发如何?

原文发布于微信公众号 - 日常学python(daily_learn)

原文发表时间:2018-03-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

c语言基础学习06_函数

============================================================================= 涉及...

2482
来自专栏前端知识分享

第191天:js---Array常用属性和方法总结

1122
来自专栏HappenLee的技术杂谈

C++雾中风景3:const用法的小结

const关键字,翻译成中文是常量,常数的意思。所以在绝大多数场合之中,const是来定义常量的,定义常量也是好的编程习惯。在C类语言之中,定义常量通常会使用宏...

1103
来自专栏互联网杂技

深入理解javascript原型和闭包(1)——一切都是对象

“一切都是对象”这句话的重点在于如何去理解“对象”这个概念。 ——当然,也不是所有的都是对象,值类型就不是对象。 首先咱们还是先看看javascript中一个常...

36516
来自专栏企鹅号快讯

每周四更面试题:True+True=?

面试题:True + Ture == ? Python 的 “+” 号会根据操作对象数据类型的不同而进行重载,操作对象为数字类型时,它是算术运算符;操作对象为序...

1917
来自专栏葡萄城控件技术团队

JavaScript 常用功能总结

小编吐血整理加上翻译,太辛苦了~求赞! 本文主要总结了JavaScript 常用功能总结,如一些常用的JS 对象,基本数据结构,功能函数等,还有一些常用的设计模...

21110
来自专栏专注 Java 基础分享

关于类的对象创建与初始化

今天,我们就来解决一个问题,一个类实例究竟要经过多少个步骤才能被创建出来,也就是下面这行代码的背后,JVM 做了哪些事情? Object obj = new ...

3355
来自专栏河湾欢儿的专栏

第九节 js里的new方法

要创建 Person 的新实例,必须使用 new 操作符。以这种方式调用构造函数实际上会经历以下 4 个步骤: (1) 创建一个新对象; (2) 将构造函...

1231
来自专栏奔跑的蛙牛技术博客

java基本程序设计

保护对象实例域,提供黑盒的概念保护数据域的安全,体现了面向对象思想。数据>算法的思想

872
来自专栏前端知识分享

第112天:javascript中函数预解析和执行阶段

关于javascript中的函数:    1、预解析:把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前    2、执行 :从上到下执行,但有例外(se...

772

扫码关注云+社区