博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之正则表达式(基础篇)
阅读量:3906 次
发布时间:2019-05-23

本文共 3576 字,大约阅读时间需要 11 分钟。

前言

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


正文

什么是正则表达式?

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

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

findall(pattern,string,flags)

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

参数如下:

pattern:正则表达式

string:要进行匹配的字符串
flags:匹配的模式
结果是一个匹配内容的列表。


常见的匹配模式

模式 描述
\w 匹配字母、数字及下划线
\W 匹配不是字母、数字及下划线的字符
\s 匹配任意空白字符,等价于[\t\n\r\f]
\S 匹配任意非空字符
\d 匹配任意数字,等价于[0-9]
\D 匹配任意非数字字符
\A 匹配字符串开头
\Z 匹配字符串结尾,如果存在换行,只匹配到换行前的结束字符串
\z 匹配字符串结尾,如果存在换行,同时还会匹配换行符
\G 匹配最后匹配完成的位置
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配一行字符串的开头
$ 匹配一行字符串的结尾
. 匹配任意字符,除了换行符,当re.DATALL标记被指定时,则可以匹配包括换行符的任意字符
[…] 用来表示一组字符,单独列出,比如[amk]匹配a、m或k
[^…] 不在[]中的字符,比如[^abc]匹配除了a、b、c之外的字符
* 匹配0个或多个表达式
+ 匹配1个或多个表达式
? 匹配0个或1个前面的正则表达式定义的片段,非贪婪模式
{n} 精确匹配n个前面的表达式
{n,m} 匹配n到m次由前面正则表达式定义的片段,贪婪模式
a|b 匹配a或b
() 匹配括号内的表达式,也表示一个组

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

‘\D’ : 与\d相反,匹配数字以外的内容
用代码来感受下:

import re#这个库是用来使用正则表达式的a='gfsxg+sad12sakdj34nva5kfh6k78'r=re.findall('\d',a)#这个就是根据\d的正则表达式来查找对应字符,其中\d是对应0-9的数字#查找非数字用\Dr1=re.findall('\D',a)print(r)print(r1)

结果:

['1', '2', '3', '4', '5', '6', '7', '8']['g', 'f', 's', 'x', 'g', '+', 's', 'a', 'd', 's', 'a', 'k', 'd', 'j', 'n', 'v', 'a', 'k', 'f', 'h', 'k']

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

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

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

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

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

结果:

# 结果['abc', 'agc']

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

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

结果:

['aac', 'acc', 'adc', 'aec', 'afc']

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

import rer=re.findall('a[b-f]c',a)#[b-f]就是表示从b到fprint(r)

结果

['abc', 'acc', 'adc', 'aec', 'afc']

概括字符集:

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

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

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

代码如下:

#概括字符集,就是用一个\加个字母来表示一类字符,比如刚开始的\d,\Dimport rea='fdsg\n134\rs3$ ghj%tyu36\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)

结果:

['f', 'd', 's', 'g', '1', '3', '4', 's', '3', 'g', 'h', 'j', 't', 'y', 'u', '3', '6', '5']['\n', '\r', '$', ' ', '%', '\t', '&']['\n', '\r', ' ', '\t']['f', 'd', 's', 'g', '1', '3', '4', '\r', 's', '3', '$', ' ', 'g', 'h', 'j', '%', 't', 'y', 'u', '3', '6', '\t', '5', '&']

数量词:

当一个字符需要连续重复匹配多次时,就要用到这个。如匹配三个字符组成的字符串:
[a-zA-z]{3} ,大括号里面的表示重复次数。
若要匹配三到六个字符,大括号的就需要这样写:{3,6}.

代码如下:

#数量词,当一个字符需要多次重复匹配时就需要用到import rea='python java0000php12 html4 css'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', 'css']['python', 'java', 'php', 'html', 'css']

其他数量词表示:

* :匹配零次或无限多次
+:匹配一次或以上
?:匹配零次或者一次

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的字符串,匹配到条件不满足时才停止匹配。

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

总结

本文只是介绍了正则表达式的基础用法,之后会有一篇稍微高级的用法。

正则表达式相关的jupyter的笔记已经上传的到我的GitHub上,有需要的可以下载下来看看,给个star也是可以的:

转载地址:http://aeren.baihongyu.com/

你可能感兴趣的文章
Vue 3拖更,尤雨溪介绍最新进展
查看>>
如何利用.NETCore向Azure EventHubs准实时批量发送数据?
查看>>
WPF 框架全构建环境虚拟机硬盘分享
查看>>
ABP框架 v3.0 已发布!
查看>>
使用.Net Core实现的一个图形验证码
查看>>
.NET 开源项目 StreamJsonRpc 介绍[中篇]
查看>>
Blazor带我重玩前端(三)
查看>>
基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (下篇)
查看>>
实现业务数据的同步迁移 · 思路一
查看>>
龙芯开源社区上线.NET主页
查看>>
eShopOnContainers 知多少[11]:服务间通信之gRPC
查看>>
闲谈设计模式
查看>>
平台or职位,你怎么选?
查看>>
骚年快答 | 技术中台与业务中台都是啥?
查看>>
骚年快答 | 微服务架构中的BFF到底是啥?
查看>>
设计模式之适配器模式
查看>>
如何利用Gitlab-CI持续部署到远程机器?
查看>>
.NET Core + K8S + Loki 玩转日志聚合
查看>>
ASP.NET Core中的分布式缓存
查看>>
在ASP.NET Core中创建自定义端点可视化图
查看>>