py爬虫 —— py爬虫基础re库

python3正则表达式

自从python1.5之后python自带re模块可以使用正则表达式,今天我们来学习一下

re.match

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

re.match(pattern, string, flags=0)
  • pattern —— 匹配的正则表达式
  • string —— 要匹配的字符串。
  • flags—— 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

正则表达式修饰符 - 可选标志

flags就是从其中选择的

  • re.I —— 使匹配对大小写不敏感
  • re.L —— 做本地化识别(locale-aware)匹配
  • re.M —— 多行匹配,影响 ^ 和 $
  • re.S —— 使 . 匹配包括换行在内的所有字符
  • re.U —— 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
  • re.X —— 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
import re

print(re.match(‘www‘, ‘www.cnblogs.com/Nlifea/‘).span())  # 在起始位置匹配,span函数是输出匹配字符串的下标序号
print(re.match(‘com‘, ‘www.cnblogs.com/Nlifea/‘))  # 不在起始位置匹配

运行结果是这样的

(0, 3)
None

我们可以用group()或groups()匹配对象函数来获取匹配表达式。

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

line = "Cats are smarter than dogs"
# .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
matchObj = re.match(‘(.*) are (.*?) .*‘, line, re.M | re.I)

if matchObj:
    print("matchObj.group() : ", matchObj.group())
    print("matchObj.group(1) : ", matchObj.group(1))
    print("matchObj.group(2) : ", matchObj.group(2))
else:
    print("No match!!")

以上实例执行结果如下:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

re.search

re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern, string, flags=0)

函数参数完全类同re.match的

import re

print(re.search(‘www‘, ‘www.cnblogs.com/Nlifea/‘).span())
print(re.search(‘com‘, ‘www.cnblogs.com/Nlifea/‘).span())  

运行结果为

(0, 3)
(12, 15)

search函数也可以使用group()并且语法一致

#!/usr/bin/python3

import re

line = "Cats are smarter than dogs";

searchObj = re.search( r‘(.*) are (.*?) .*‘, line, re.M|re.I)

if searchObj:
   print ("searchObj.group() : ", searchObj.group())
   print ("searchObj.group(1) : ", searchObj.group(1))
   print ("searchObj.group(2) : ", searchObj.group(2))
else:
   print ("Nothing found!!")

以上实例执行结果如下:

searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.match与re.search的区别

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

import re

line = ‘Cat are smarter than dogs‘ ;

matchObj = re.match(r‘digs‘ ,line ,re.M|re.I ) ;
if matchObj:
    print("match -- > matchObj.group() : " ,matchObj.group())
else:
    print("No match!!")

researchObj = re.search(r‘dogs‘ ,line ,re.M|re.I) ;
if researchObj:
    print("search -- > matchObj.group : " , researchObj.group())
else:
    print("No match!!")

结果为

No match!!
search -- > matchObj.group :  dogs

检索和替换

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

语法:

re.sub(pattern, repl, string, count=0, flags=0)

参数:

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  • flags : 编译时用的匹配模式,数字形式。

前三个为必选参数,后两个为可选参数。

import re

phone = "200-6456-848 #这是一个电话号码"

num = re.sub(r‘#.*$‘,"",phone )
print(num)

num = re.sub(r‘\D‘,"",num)
print(num)

结果是

200-6456-848
2006456848

关于 \D 请看这里 正则表达式模式

compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

语法格式为:

re.compile(pattern[, flags])

参数:

  • pattern : 一个字符串形式的正则表达式
  • flags 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:

flags的具体内容请看 正则表达式修饰符 - 可选标志

import re

pattern = re.compile(r‘\d+‘)
m = pattern.match(‘one12twothree34four‘)
print(m)
m = pattern.match(‘one12twothree34four‘,2,10)
print(m)
m = pattern.match(‘one12twothree34four‘,3,10)
print(m)
print(m.group(0))
print(m.start(0))
print(m.end(0))
print(m.span(0))

结果是:

None
None
<_sre.SRE_Match object; span=(3, 5), match=‘12‘>
12
3
5
(3, 5)

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

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

findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法格式为:

re.findall(string[, pos[, endpos]])

参数:

  • string —— 待匹配的字符串。
  • pos —— 可选参数,指定字符串的起始位置,默认为 0。
  • endpos —— 可选参数,指定字符串的结束位置,默认为字符串的长度。
import re

pattern = re.compile(r‘\d+‘)

res = pattern.findall(‘runoob 123 google 456‘)
res1 = pattern.findall(‘run88oob123google456‘, 0, 10)

print(res)
print(res1)

结果:

[‘123‘, ‘456‘]
[‘88‘, ‘12‘]

re.split

split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

re.split(pattern, string[, maxsplit=0, flags=0])

参数:

  • pattern —— 匹配的正则表达式
  • string —— 要匹配的字符串。
  • maxsplit —— 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
  • flags —— 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
import re

print(re.split(‘\W+‘,‘runoob, runoob, runoob.‘))

print(re.split(‘(\W+)‘,‘runoob, runoob, runoob.‘))

print(re.split(‘a*‘, ‘hello world‘))

结果是:

[‘runoob‘, ‘runoob‘, ‘runoob‘, ‘‘]
[‘runoob‘, ‘, ‘, ‘runoob‘, ‘, ‘, ‘runoob‘, ‘.‘, ‘‘]
[‘hello world‘]

re库中正则表达式的对象

re.RegexObject

re.compile() 返回 RegexObject 对象。

re.MatchObject

group() 返回被 RE 匹配的字符串。

  • start() —— 返回匹配开始的位置
  • end() —— 返回匹配结束的位置
  • span() —— 返回一个元组包含匹配 (开始,结束) 的位置

原文地址:https://www.cnblogs.com/Nlifea/p/11761471.html

时间: 2024-11-05 15:53:02

py爬虫 —— py爬虫基础re库的相关文章

利用简易爬虫完成一道基础CTF题

利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如果文中有哪些问题,也欢迎大家指正. Written by Menglin Ma 写在前面 ??如果有想学习基础爬虫的同学,建议在中国大学MOOC上搜索嵩天老师的爬虫课程,讲的真的很细致,也很基础. ??想入门CTF的同学,给你们推荐个基础的网站,上面的好多题对新手比较友好:www.shiyanbar

转 Python爬虫入门四之Urllib库的高级用法

静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览器,调试浏览器F12,我用的是Chrome,打开网络监听,示意如下,比如知乎,点登录之后,我们会发现登陆之后界面都变化了,出现一个新的界面,实质上这个页面包含了许许多多的内容,这些内容也不是一次性就加载完成的,实质上是执行了好多次请求,一般

学习Python爬虫第一步,Bs4库

首先是安装BS4库 因为Python的pip真的很方便,所以一般不出意外,只需要一个pip就足以完成一个库的安装. pip install beautifulsoup4 名字很长不要记错名字呦. 想要利用爬虫获得我们想要的内容,就一定要学会一个解析HTML的库. 我们总不能用正则表达式,匹配出我们需要的内容,那任务量一定是巨大的,繁琐的,很少有人去那么做,除非你就是需要这个网页中特定的元素. 怎么使用BS4库? Bs4库和有些库还有一些不同,像我们学习爬虫一定要学习的requests库,我们只需

爬虫-认识爬虫

爬虫 - 认识爬虫 什么是上网?爬虫要做的是什么? 我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程. 用户获取网络数据的方式是: 浏览器提交请求->下载网页代码->解析/渲染成页面. 而爬虫程序要做的就是: 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 定义 通过编写程序,模拟浏览器上网,向网站发起请求,让其去互联网上获取数据后分析并提取有用数据的程序爬虫的基本流程 """

(C/C++)基于SharpUI控件库的插件式框架开发--第三篇框架基础服务库

一个框架基础的东西,一般也是操作的最基础的类,比如char.int.bool等,有时出现内存泄露的问题导致错误的抛出,但是C++开发有的时候就算是抛出异常,那也是靠经验来积累才能非常快速准确的找出错误所在,这就需要在框架中需要添加日志管理的接口,日志管理的好处就是开发者自身在找异常时提供参考,另一个就是如果用户操作时出现问题,也可将日志反馈,帮助快速解决问题:总之了为了更好的扩展完善我的框架,我详细列一下这个基础服务库(XPCore)包含内容: 虽说sharpui控件库内封闭好string类,但

python 解析html基础 HTMLParser库,方法,及代码实例

HTMLParser, a simple lib as html/xhtml parser 官方解释: This module defines a class HTMLParser which serves as the basis for parsing text files formatted in HTML (HyperText Mark-up Language) and XHTML.Unlike the parser in htmllib, this parser is not base

【java爬虫】---爬虫+基于接口的网络爬虫

爬虫+基于接口的网络爬虫 上一篇讲了[java爬虫]---爬虫+jsoup轻松爬博客,该方式有个很大的局限性,就是你通过jsoup爬虫只适合爬静态网页,所以只能爬当前页面的所有新闻.如果需要爬一个网 站所有信息,就得通过接口,通过改变参数反复调该网站的接口,爬到该网站的所有数据信息. 本博客以爬金色财经新闻信息为对象,去爬取该网站从建站以来发表的所有新闻信息.下面会一步一步讲解.这里重点重点讲思路,最后我会提供完整源码. 第一步:找接口 你要获得该网站所有新闻数据,第一步当然是获得接口,通过接口

python3爬虫--反爬虫应对机制

python3爬虫--反爬虫应对机制 内容来源于: Python3网络爬虫开发实战: 网络爬虫教程(python2): 前言: 反爬虫更多是一种攻防战,针对网站的反爬虫处理来采取对应的应对机制,一般需要考虑以下方面: ①访问终端限制:这种可通过伪造动态的UA实现: ②访问次数限制:网站一般通过cookie/IP定位,可通过禁用cookie,或使用cookie池/IP池来反制: ③访问时间限制:延迟请求应对: ④盗链问题:通俗讲就是,某个网页的请求是有迹可循的,比如知乎的问题回答详情页,正常用户行

IOTutility 一个轻量级的 IOT 基础操作库

目录 IOTutility 一个轻量级的 IOT 基础操作库 1. 为什么要写一个 IOT 编程库? 2. IOTutility 具有什么功能? 3. IOTutility 有什么特点 IOTutility 实现了哪些功能 MQTT protocol implement MQTT 实现 1. 创建一个 MQTT_Session 2. 连接到服务器 3. 订阅感兴趣的主题 4. 可以通过 Publish 接口直接上传消息给服务器 如何使用 1. 下载代码 2. 编译代码库 3. 编译示例程序并执行

Logan:美团点评的开源移动端基础日志库

前言 Logan是美团点评集团移动端基础日志组件,这个名称是Log和An的组合,代表个体日志服务.同时Logan也是"金刚狼"大叔的名号,当然我们更希望这个产品能像金刚狼大叔一样犀利. Logan已经稳定迭代了一年多的时间.目前美团点评绝大多数App已经接入并使用Logan进行日志收集.上传.分析.近日,我们决定开源Logan生态体系中的存储SDK部分(Android/iOS),希望能够帮助更多开发者合理的解决移动端日志存储收集的相关痛点,也欢迎更多社区的开发者和我们一起共建Logan