python与正则表达式的那些事

正则表达式可以提高复杂文本分析的效率,面试时常会问到相关知识,本文我们将一起学习介绍了Python正则表达式基本概念、为什么使用正则表达式、正则语法、re模块及相关方法使用,如何使用正则表达式处理文件,让我们对python正则全面了解。

简单的文本处理可以使用字符串匹配,使用endwith和startwith函数加上字符串切片可以完成,但是当匹配的量太大,规则太多,使用正则表达式显得更游刃有余。

正则表达式的概念

  1. 使用单个字符串来描述匹配一系列符合某个句法规则的字符串
  2. 是对字符串操作的一种逻辑公式
  3. 应用场景:处理文本和数据
  4. 正则表达式过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功,否则匹配失败

正则表达式之re模块使用:
re:python正则表达式模块
第一个正则表达式
实例

import re                                                   #导入re模块
pa = re.compile(r'imooc')     #匹配的字符,r指的是原字符串,返回的是pattern 对象
ma = pa.match('imooc.com')      #使用pattern对象的match()方法,返回none或一个match对象
ma.group()      ==>imooc                       #返回匹配的字符    
ma.span()      ==>(0,5)                        #被匹配字符串所在索引位置
ma.string  ==>'imooc.com'                 #返回被匹配字符串

上面实例中,re.compile(r"***")是主要用来匹配正则表达式的方法,可以添加不同的参数,比如加括号,用ma.groups()返回一个数组,可以加上re.I来ignore大小写匹配

而且
——str1=‘imooc python’
pa=re.compile(r’imooc’) #先生成一个对象,这个对象可以重复使用
ma=pa.match(str1) #再调用对象的match方法

——ma=re.match(r’imooc’,str1) #这样写的效果与上面的是一样的,只是用re生成临时对象,没调用一次就要生成一次

正则表达式的基本语法语法不仅适用于python,对其他的语言也适用,让我们一起来熟悉正则表达式的基本语法:

1.匹配单个字符语法:

字符匹配
.匹配任意字符(除\n以外)
[…]匹配字符集,比如[a-zA-Z0-9]
\D匹配一个非数字字符。等价于 [^0-9]。
\d匹配一个数字字符。等价于 [0-9]
\w匹配任何单词字符等价于 [A-Za-z0-9]
\W匹配任何非单词字符等价于[^A-Za-z0-9_]
\s匹配任何空白字符,包括空格、制表符、换页符等等 等价于 [ \f\n\r\t\v]
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
[0-9]匹配任何数字。类似于 [0123456789]
[A-Z]匹配任何大写字母
[a-z]匹配任何小写字母
[a-zA-Z0-9]匹配任何字母及数字
  1. 匹配多个字符语法:
字符匹配
+匹配前一个字符1次或者无限次
匹配前一个字符0次或者1次
{m}/{m,n}匹配前一个字符m次或者m到n次
*匹配前一个字符0次或者无限次
*?/+?/??匹配模式为非贪婪,尽可能少匹配字符,不加?为贪婪模式

实例:判断变量Python有效性,变量必须以下划线或者字母开头
正则表达式为r’[_a-zA-z]+[下划线\w]*'

*非贪婪模式匹配,就是尽量匹配少一点,所以如果是 * 可以匹配0或多次,那么 ? 就只匹配0次, 同理 + 匹配1到多次,那么 +? 就只匹配1次

  1. 边界匹配基本语法
字符匹配
^匹配字符串开头
$匹配字符串结尾
\A/\Z指定字符串必须出现在开头/结尾(\Aimooc表示以imooc开头)
  1. 分组匹配基本语法
字符匹配
|匹配左右任意一个表达式
(ab)括号中表达式作为一个分组
(?P)分组起一个别名
<number>引用编号为number的分组匹配到的字符串
(?P=name)引用别名为name的分组匹配字符串

re模块的其他方法:

  1. search(pattern,string,flags=0)在一个 字符串中 查找 匹配
  2. findall(pattern,string,flags=0)找到匹配,返回所有匹配部分的列表
  3. sub(pattern,repl,string,count=0,flags=0) 将字符串中正则表达式的部分替换成其他值
    sub中的repl可以是pattern匹配后返回match对象的函数操作
    repl可以是对返回的match对象的函数(add1)
  4. split(pattern,string,maxsplit=0,flags=0),根据匹配分割字符串,返回分割字符串组成的列表

re模块的split

python正则练习之抓取网页图片——慕课网课程图片为例:

简单爬取网页图片步骤:

1)分析网页元素

2)使用urllib2打开链接

3)读取链接文本

4)使用re匹配出期望文本内容并分条存入list

5)创建文件定义文件名规则,并将list中的链接逐条用urllib2打开后写入

#导入re模块和urllib模块中的request 
import re
from urllib import request 
     
#匹配图片网址,存入列表变量listurl
url = 'https://www.imooc.com/course/list' 
buf = request.urlopen(url).read().decode('utf-8')
listurl = re.findall(r'src=.+\.jpg',html)

#把src="去掉
for i in range(len(listurl)):    
     listurl[i] = re.sub(r'src="',"",listurl[i])     
     
#遍历列表listurl中的图片网址,取出图片写入本地文件中     
i = 0    #图片编号变量
for url in listurl:
    f = open(str(i)+'.jpg','wb+')       #相对路径,  wb+方式打开
    buf = request.urlopen(”https:"+url).read()        #要加https:,是通过查看网页审查元素得出的 
    f.write(buf)
    f.close()
    i += 1

结果如下:
抓取结果

阅读更多精彩内容,请关注微信公众号:大众学python
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫96

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值