数据分析——Python网络爬虫(四){正则表达式}

news2024/9/23 7:31:14

爬虫库的使用

  • 爬虫的步骤
  • 正则表达式
    • 正则表达式的流程
    • 正则表达式的使用
      • 括号的使用
      • 管道匹配
      • 问号匹配
      • 星号匹配
      • 加号匹配
      • 花括号匹配
      • 用点-星匹配所有字符
      • 跨行匹配
      • findall方法
      • 其他常用字符匹配
  • 例子
  • 正则表达式在线测试

爬虫的步骤

获取网页源代码-urllib或者request等
信息提取--正则表达式或者bs或者lmxl等
保存本地数据库

正则表达式

  正则表达式,简称为regex,是文本模式的描述方法,用于描述一组字符串特征的模式,用来匹配特定的字符串。通过特殊字符+普通字符来进行模式描述,从而达到文本匹配目的工具。

	我们举一个例子,比如说我们要判断电话号码,我们可以编写出这样的一个函数代码
def isPhoneNumber(text):
    if len(text) != 12:
        return False
    for i in range(0, 3):
        if not text[i].isdecimal():
            return False
    if text[3] != '-':
            return False
    for i in range(4, 7):
        if not text[i].isdecimal():
                return False
    if text[7] != '-':
                return False
    for i in range(8, 12):
        if not text[i].isdecimal():
            return False
    return True
isPhoneNumber('425-434-3434') #刚好匹配正确
isPhoneNumber('4325-434-3434') #匹配不正确
	那么我们继续从一长串字符中查找电话号码
message = 'Call me at 415-555-1011 tomorrow. 415-555-9999 is my office.'
for i in range(len(message)):
    chunk = message[i:i+12]
    if isPhoneNumber(chunk):
        print('Phone number found: ' + chunk)
print('Done')
	通过运行代码,我们可以得到结果:
	Phone number found: 415-555-1011
	Phone number found: 415-555-9999
	Done

  我们通过代码逻辑,可以发现到的是,这样的函数代码去匹配电话号码,其实效率很低,我们需要从一长串字符中,12个字符为一组,然后对字符串进行切片,然后直到12个字符完全符合isPhoneNumber()函数。

	那么如果我们采用正则表达式呢?
import re
phoneNumRegex = re.compile('\d\d\d-\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('My number is 441-545-4242.') #返回首次出现
mo.group()#通过group返回匹配结果
	运行结果:'441-545-4242'
	※	\d是一个正则表达式中的特殊字符,表示一位数字字符,即任何一位0到9的数字

  那么其实我们很明显的看到的就是 正则表达式在匹配文本时,要比去敲写一段代码,效率更高了。
  我们来根据上述代码来分析一下正则表达式的流程。

正则表达式的流程

  1. 首先,Python中所有正则表达式的函数都在re模块

  2. 然后会向re.compile()传入一个字符串值,表示正则表达式,它将返回一个regex模式对象
    在这里插入图片描述

    那么正则表达式是如何匹配regex对象的呢?
    
    1. regex对象的search()方法查找传入的字符串,寻找该正则表达式的 所有匹配
    2. 如果字符串中没有找到该正则表达式模式,search()方法将None。如果找到了该模式,search()方法将返回一个match对
    3. search对象有一个group()方法,它返回被查找字符串中实际匹配的文本,如果没有实际匹配的文本,就会报错,所以一般来说,代码会这么写。
phoneNumRegex = re.compile('\d\d\d-\d\d\d-\d\d\d\d')#raw
mo = phoneNumRegex.search('My number is 34-555-4242.')#首次出现
if mo:
    print(mo.group())#通过group返回匹配结果

正则表达式的使用

  这里将介绍正则表达式中不同的匹配的方式

括号的使用

   利用括号进行分组

   比如将区号从电话号码中分离,添加括号将在正则表达式中创建“分组” —— (\d\d\d)-(\d\d\d-\d\d\d\d)
   然后可以使用group()匹配对象方法,从一个分组中获取匹配的文本
   第一对括号是第1组。第二对括号是第2组。向group()传入整数1或2,可以取得匹配文本的不同部分。向group()方法传入0或不传入参数,将返回整个匹配的文本。

import re
phoneNumRegex = re.compile('(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('My number is 341-555-4242.')
mo.group(0)# 返回所有的匹配结果
mo.group(1)# 返回第一个括号的匹配结果
mo.groups()# 返回元组
返回结果:'341-555-4242'
         '341'
         ('341', '555-4242')

管道匹配

   利用管道进行分组

   字符|称为“管道”。希望匹配许多表达式中的一个时,就可以使用它 。 例 如 , 正则表达式 ‘Batman|Spiderman’ 将匹配 ‘Batman’ ‘Spiderman’
   如果Batman和Spiderman都出现在被查找的字符串中,第一次出现的匹配文本,将作为match对象返回

mport re
heroRegex = re.compile ('Batman|Spiderman')
mo1 = heroRegex.search('Batman Spiderman Batman')
mo1.group()#第一次出现的匹配文本
	运行结果:'Batman'
batRegex = re.compile('Bat(man|mobile|copter|bat)')
#可以匹配'Batman'、'Batmobile'、'Batcopter'和'Batbat'中任意一个。因为所有这些字符串都以Bat开始
mo = batRegex.search('Batmobile lost a wheel')
mo.group()
	运行结果:'Batmobile'

问号匹配

  用问号实现可选匹配

  不论这段文本在不在,正则表达式都会认为匹配。字符?表明它前面的分组在这个模式中是可选

import re
batRegex = re.compile('Bat(wo)?man')
# 既可以匹配Batman ,也可以匹配Batwomen
mo1 = batRegex.search('The Adventures of Batman')
mo1.group()
	运行结果:'Batwoman'
phoneRegex = re.compile('(\d\d\d-)?\d\d\d-\d\d\d\d')
#包含或者不包含区号
mo1 = phoneRegex.search('My number is 415-555-4242')
print(mo1.group())
mo2 = phoneRegex.search('My number is 555-4242')
print(mo2.group())
运行结果:415-555-4242
 		 555-4242

星号匹配

  用星号匹配零次或多次

   *(称为星号)意味着“匹配零次或多次”,即星号之前的分组,可以在文本中出现任意次。它可以完全不存在,或一次又一次地重复

import re
batRegex = re.compile('Bat(wo)*man')
mo1 = batRegex.search('The Adventures of Batwowoman')
mo2 = batRegex.search('The Adventures of Batman')
mo1.group()
mo2.group()
	运行结果:'Batwowoman'
	         'Batman'

加号匹配

  用加号匹配一次或多次

  +(加号)则意味着“匹配一次或多次”。星号不要求分组出现在匹 配的字符串中,但加号不同,加号前面的分组必须“至少出现一次”

import re
batRegex = re.compile('Bat(wo)+man')
mo1 = batRegex.search('The Adventures of Batwowoman')
mo1.group()
	运行结果:'Batwowoman'

花括号匹配

   花括号匹配特定次数

   如果想要一个分组重复特定次数,就在正则表达式中该分组的后面,跟上花括号包围的数字。例如,正则表达式(Ha){3}将匹配字符串’HaHaHa’,但不会匹配’HaHa’
   可以指定一个范围,即在花括号中写下一个最小值、一个逗号和一个最大值 。 例 如 , 正则表达式 (Ha){3,5} 将匹配 ‘HaHaHa’ 、‘HaHaHaHa’和’HaHaHaHaHa’ 即可以匹配Ha3次到5次。

#花括号匹配特定次数
haRegex = re.compile('(ha){3}')
mo1 = haRegex.search('hahahahha')
mo1.group()
 	运行结果:'hahaha'

   正则表达式默认是贪婪的,尽可能匹配最长的字符串
   非贪婪:加问号,尽可能匹配最短的字符

#匹配特定次数,指定范围
haRegex = re.compile('(ha){2,4}')#贪婪匹配。
mo1 = haRegex.search('hahahaha')
mo1.group()
	运行结果:'hahahaha'
#匹配特定次数,
haRegex = re.compile('(ha){2,4}?')#非贪婪匹配
mo1 = haRegex.search('hahahahha')
mo1.group()
	运行结果:'haha'

用点-星匹配所有字符

   .:匹配任意字符,除非换行
   *:匹配零个或者多个表达式

#点匹配任意一个字符
haRegex = re.compile('<.>')
mo2 = haRegex.search('fdf<4>kkkfk')
mo2.group()
	运行结果:'<4>'
#点星匹配任意字符
haRegex = re.compile('<.*>')
mo2 = haRegex.search('fdf<4fd809475049758094gg>kkkfk')
mo2.group()
	运行结果:'<4fd809475049758094gg>'
#点星匹配任意字符
haRegex = re.compile('<.*?>')#非贪婪模式,用得最多
mo2 = haRegex.search('fdf<hahaha>haha>kkkfk')
mo2.group()
	运行结果:'<hahaha>'

跨行匹配

   re.DOTALL匹配跨行

haRegex = re.compile('<.*>',re.DOTALL)
text='''weret<ttt
fdfd>fdf'''
mo2 = haRegex.search(text)
mo2.group()
	运行结果:'<ttt\nfdfd>'

findall方法

   匹配表达式的所有内容(包括首次出现)

#findall
import re
kk = re.compile('\d+')
kk.findall('one1two2three34four4444')
#匹配所有数字,加表示一个或者多个
	运行结果:['1', '2', '34', '4444']

   关于findall方法,还可以写第二种方法

import re
patt='[1-5][0-9]'
lis=[10,20,30,40,2,3,59,60,'aa','3aaa']
match=re.findall(patt,str(lis))
	运行结果:['10', '20', '30', '40','59','60']

其他常用字符匹配

在这里插入图片描述

注意:^表示的是匹配字符串的开头;[ ^ 字符串 ]表示匹配方括号内字符串以外的字符串。

例子

#例子一
#匹配哪些字符
import re
words=['gold',' Google','Sogu','Guess']
patt=re.compile('.*g[^u]')  
for w in words:
   m=patt.findall(w)
   if m: #条件判断中,只要不为0,不为none,不为空的值均和Ture等价
      print(w)
	运行结果:gold
			 Google
#例子二
#把字符中,10至59取出来 lis=[10,20,30,40,2,3,59,60,'aa','3aaa']
import re
patt='[1-5][0-9]' # 正则表达式
lis=[10,20,30,40,2,3,59,60,'aa','3aaa']
match=re.findall(patt,str(lis)) # 转换成字符串
if match:
  print(match)
	运行结果:['10', '20', '30', '40', '59']
#例子三
#匹配电话号码和邮箱
import re
import pyperclip
#为电话创建一个正则表达式
phoneRegex = re.compile('\d{8,11}')#8位
#为E-mail 地址创建一个正则表达式
emailRegex = re.compile('''(
[a-zA-Z0-9_%+-]+ # username
@  # @symbol
[a-zA-Z0-9-]+ # domain name
\.
[a-zA-Z]{2,4}  #dot-something
)''', re.VERBOSE) 				#管理复杂文本模式,忽略空白符和注释

# Find matches in clipboard text.
text = str(pyperclip.paste())		#从粘贴板过来的字符串
matches = []
for groups in phoneRegex.findall(text):
    matches.append(groups)   
for groups in emailRegex.findall(text):
    matches.append(groups)
# Copy results to the clipboard.
if len(matches) > 0:
    print('Copied to clipboard:')
    print('\n'.join(matches))
else:
    print('No phone numbers or email addresses found.')

注:
  因为Text文本过长,所以我不粘贴到这里,其实text文本不重要,大家自己找一个text文本就可以运行。代码里同学们可能陌生的是pyperclip模块和matchs.append(groups)
  下面这是链接解释
    pyperclip模块
    append的使用

正则表达式在线测试

  在线测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1922562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web开发 —— 放大镜效果(HTML、CSS、JavaScript)

目录 一、需求描述 二、实现效果 三、完整代码 四、实现过程 1、HTML 页面结构 2、CSS 元素样式 3、JavaScript动态控制 &#xff08;1&#xff09;获取元素 &#xff08;2&#xff09;控制大图和遮罩层的显隐性 &#xff08;3&#xff09;遮罩层跟随鼠标移动 &…

【电脑应用技巧】如何寻找电脑应用的安装包华为电脑、平板和手机资源交换共享

电脑的初学者可能会直接用【百度】搜索电脑应用程序的安装包&#xff0c;但是这样找到的电脑应用程序安装包经常会被加入木马或者强制捆绑一些不需要的应用装入电脑。 今天告诉大家一个得到干净电脑应用程序安装包的方法&#xff0c;就是用【联想的应用商店】。联想电脑我是一点…

使用Lego进行证书的申请和更新

姊妹篇: 使用Let’s Encrypt 申请通配符证书 关于acme 协议 ACME是自动证书管理环境&#xff08;Automatic Certificate Management Environment&#xff09;的缩写&#xff0c;是一个由IETF&#xff08;Internet Engineering Task Force&#xff09;制定的协议标准&#xff0c…

gd32F470串口重定义

c代码&#xff1a; /** Author: Bleaach008* Date: 2024-07-10 17:31:01* LastEditTime: 2024-07-11 09:42:06* FilePath: \MDK-ARMd:\Code\GD32\GD01_UART\MyApplication\Public.c* Description:** Copyright (c) 2024 by 008, All Rights Reserved.*/ /* Includes ----------…

QFileDialog的简单了解

ps&#xff1a;写了点垃圾&#xff08;哈哈哈&#xff09; 现在感觉Qt库应该是调用了Windows提供的这块的接口了。 它继承自QDialog 这是Windows自己的文件夹 这是两者的对比图&#xff1a; 通过看QFileDialog的源码&#xff0c;来分析它是怎么实现这样的效果的。 源码组成…

面试篇-Java-5+设计模式

文章目录 前言一、你知道工厂方法模式吗1.1 你有使用过简单工厂模式吗1.2 你有使用过简单工厂方法模式吗1.3 你有使用过抽象工厂方法模式吗1.4 你有使用过策略模式吗 二、你们项目中是怎么使用设计模式的呢2.1 策略模式 工厂模式 实现不同的方式的登录2.1.1 定义一个登录的接口…

SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测

SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测 目录 SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现NGO-CNN-LSTM-Mutilhead-Attention北方苍鹰算…

怎么用PPT录制微课?详细步骤解析!

随着信息技术的不断发展&#xff0c;微课作为一种新型的教学形式&#xff0c;因其短小精悍、针对性强等特点&#xff0c;在教育领域得到了广泛的应用。而PPT作为一款常用的演示工具&#xff0c;不仅可以用来制作课件&#xff0c;还可以利用其内置的录屏功能或结合专业的录屏软件…

【机器学习】Exam4

实现线性不可分logistic逻辑回归 我们目前所学的都是线性回归&#xff0c;例如 y w 1 x 1 w 2 x 2 b y w_1x_1w_2x_2b yw1​x1​w2​x2​b 用肉眼来看数据集的话不难发现&#xff0c;线性回归没有用了&#xff0c;那么根据课程所学&#xff0c;我们是不是可以增加 x 3 x…

有必要把共享服务器升级到VPS吗?

根据自己的需求来选择是否升级&#xff0c;虚拟专用服务器 (VPS) 是一种托管解决方案&#xff0c;它以低得多的成本提供专用服务器的大部分功能。使用 VPS&#xff0c;您的虚拟服务器将与在其上运行的其他虚拟服务器共享硬件服务器的资源。但是&#xff0c;与传统的共享托管&am…

# Redis 入门到精通(一)数据类型(4)

Redis 入门到精通&#xff08;一&#xff09;数据类型&#xff08;4&#xff09; 一、redis 数据类型–sorted_set实现时效性任务管理 1、sorted_set 类型数据操作的注意事项 score 保存的数据存储空间是64位&#xff0c;如果是整数范围是-9007199254740992~9007199254740992…

内网对抗-基石框架篇域树林域森林架构信任关系多域成员层级信息收集环境搭建

知识点&#xff1a; 1、基石框架篇-域树&域林架构-权限控制-用户和网络 2、基石框架篇-域树&域林架构-环境搭建-准备和加入 3、基石框架篇-域树&域林架构-信息收集-手工和工具1、工作组(局域网) 将不同的计算机按照功能分别列入不同的工作组。想要访问某个部门的…

PostgreSQL 怎样处理数据仓库中维度表和事实表的关联性能?

文章目录 PostgreSQL 中维度表和事实表关联性能的处理 PostgreSQL 中维度表和事实表关联性能的处理 在数据仓库的领域中&#xff0c;PostgreSQL 作为一款强大的关系型数据库管理系统&#xff0c;对于处理维度表和事实表的关联性能是一个关键的问题。维度表和事实表的关联是数据…

基于B站视频评论的文本分析,采用包括文本聚类分析、LDA主题分析、网络语义分析

研究主题 本研究旨在通过对B站视频评论数据进行文本分析&#xff0c;揭示用户评论的主题、情感倾向和语义结构&#xff0c;助力商业决策。主要技术手段包括Python爬虫、LDA主题分析、聚类分析和语义网络分析。首先&#xff0c;利用Python爬虫采集大量评论数据并进行预处理。运…

Hadoop3:动态扩容之新增一台机器的初始化工作

一、需求描述 给Hadoop集群动态扩容一个节点 那么&#xff0c;这个节点是全新的&#xff0c;我们需要做哪些准备工作&#xff0c;才能将它融入集群了&#xff1f; 二、初始化配置 1、修改IP和hostname vim /etc/sysconfig/network-scripts/ifcfg-ens33 vim /etc/hostname2、…

激活交通运输创新活力 推进户外安全指数——北三车载终端TD3D:准确追踪 应急救援

根据交通运输部办公厅发布《关于充分发挥全国道路货运车辆公共监管与服务平台作用支撑行业高质量发展的意见》&#xff08;下称《意见》&#xff09;。《意见》提出&#xff0c;要持续拓展货运平台服务功能&#xff0c;加快推动北斗终端应用。 《意见》提出&#xff0c;加快单…

【eNSP模拟实验】单臂路由实现VLAN间通信

实验需求 如下图所示&#xff0c;辅导员办公室需要访问处在不同vlan的学生管理服务器的文件&#xff0c;那么如何实现两台终端相互通信呢&#xff1f;我们可以使用单臂路由的方式来实现。 单臂路由&#xff08;router-on-a-stick&#xff09;是指在路由器的一个接口上通过配置…

Hadoop-25 Sqoop迁移 增量数据导入 CDC 变化数据捕获 差量同步数据 触发器 快照 日志

章节内容 上节我们完成了如下的内容&#xff1a; Sqoop MySQL迁移到HiveSqoop Hive迁移数据到MySQL编写脚本进行数据导入导出测试 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机…

某某会员小程序后端性能优化

背景 某某会员小程序后台提供开放平台能力&#xff0c;为三方油站提供会员积分、优惠劵等api。当用户在油站加油&#xff0c;油站收银会调用我们系统为用户发放积分、优惠劵等。用户反馈慢&#xff0c;三方调用发放积分接口性能极低&#xff0c;耗时30s&#xff1b; 接口情况…

短视频SEO矩阵系统:源码开发与部署全攻略

在数字化时代&#xff0c;短视频已成为人们获取信息、娱乐休闲的重要方式。随着短视频平台的兴起&#xff0c;如何让自己的内容在众多视频中脱颖而出&#xff0c;成为每个创作者和内容运营者关注的焦点。本文将为您深入解析短视频SEO矩阵系统的源码开发与部署&#xff0c;助您在…