爬虫入门指南:如何使用正则表达式进行数据提取和处理

news2024/11/26 2:34:59

文章目录

  • 正则表达式
  • 正则表达式中常用的元字符和特殊序列
    • 案例
  • 使用正则表达式提取数据
  • 案例
  • 存储数据到文件或数据库
    • 使用SQLite数据库存储数据的示例代码
    • SQLite基本语法
      • 创建表格:
      • 插入数据:
      • 查询数据:
      • 更新数据:
      • 删除数据:
      • 条件查询:
      • 排序:
    • 代码案例
  • 未完待续…

正则表达式

正则表达式

正则表达式是一种用于匹配和处理文本的工具,可以定义规则和模式来查找、替换和提取目标数据。Python中内置的re模块可用于操作正则表达式。

正则表达式中常用的元字符和特殊序列

  • .:匹配任意字符(除了换行符)。
  • \d:匹配任意数字。
  • \w:匹配任意字母数字字符(包括下划线)。
  • \s:匹配任意空白字符(包括空格、制表符等)。
  • +:匹配前面的元素一次或多次。
  • *:匹配前面的元素零次或多次。
  • ?:匹配前面的元素零次或一次。
  • {n}:匹配前面的元素恰好n次。
  • {n,}:匹配前面的元素至少n次。
  • {n,m}:匹配前面的元素至少n次且不超过m次。

正则表达式还支持分组、贪婪与非贪婪匹配、边界匹配等高级功能。

案例

假设我们有一个字符串text = "Hello, my phone number is 123-456-7890",我们想从中提取出手机号码。可以使用正则表达式\d{3}-\d{3}-\d{4}进行匹配。

import re

text = "Hello, my phone number is 123-456-7890"

match = re.search(r"\d{3}-\d{3}-\d{4}", text)
if match:
    phone_number = match.group()
    print(phone_number)

输出结果为:123-456-7890

分析说明 :

代码中,正则表达式模式\d{3}-\d{3}-\d{4}用于匹配电话号码的格式。这个模式由以下部分组成:

  • \d{3}:匹配三个连续的数字。
  • -:匹配一个横线字符。
  • \d{3}:匹配三个连续的数字。
  • -:匹配一个横线字符。
  • \d{4}:匹配四个连续的数字。
    注意:\d代表数字字符。

如果re.search()函数找到了匹配的结果,它将返回一个Match对象,否则返回None。

接着,使用条件语句if match来检查是否找到了匹配结果。如果找到了匹配,就执行以下代码块。

match.group()方法用于获取匹配结果的字符串表示。

使用正则表达式提取数据

Python中,我们可以利用re模块的函数使用正则表达式进行数据提取。常用的函数有:

  • re.search(pattern, string):在给定字符串中查找第一个匹配项,并返回一个匹配对象。通过匹配对象的方法如group()start()end(),可以获取具体的匹配结果。
  • re.findall(pattern, string):在给定字符串中查找所有匹配项,并以列表形式返回所有结果。
  • re.sub(pattern, repl, string):在给定字符串中查找匹配项,并将其替换为指定内容。
  • re.split(pattern, string):根据给定模式对字符串进行拆分,并以列表形式返回拆分后的结果。

案例

假设我们有一个包含多个电子邮件地址的字符串text = "Contact us at info@example.com or support@example.com",我们想提取出其中的电子邮件地址。可以使用正则表达式\w+@\w+\.\w+进行匹配。

import re

text = "Contact us at info@example.com or support@example.com"

emails = re.findall(r"\w+@\w+\.\w+", text)
print(emails)

输出结果为:
在这里插入图片描述

分析说明:

正则表达式模式\w+@\w+.\w+用于匹配电子邮件地址的格式。这个模式由以下部分组成:

  • \w+:匹配一个或多个字母、数字或下划线字符(即匹配邮箱地址的用户名部分)。
  • @:匹配一个 @ 符号。
  • \w+:匹配一个或多个字母、数字或下划线字符(即匹配邮箱地址的域名部分)。
  • .:匹配一个点(.)字符。
  • \w+:匹配一个或多个字母、数字或下划线字符(即匹配邮箱地址的顶级域名部分)。

注意:\w代表字母、数字或下划线字符。
re.findall()函数将返回一个包含所有匹配的字符串列表。

存储数据到文件或数据库

PYTHON 存储数据

在Python中,我们可以使用内置的文件操作函数来将数据保存到文件中。

首先,使用open()函数打开一个文件,传入两个参数:文件名和打开模式。打开模式可以是 “w”(写入)、“a”(追加)、“r”(只读)等。如果文件不存在,将会创建一个新的文件。

with open("data.txt", "w") as file:
    file.write("这是要保存的数据")

代码中,我们使用open()函数打开名为"data.txt"的文件,并指定打开模式为"w"(写入)。然后,使用文件对象的write()方法将数据写入文件中。
如果需要更复杂的数据管理和查询,可以使用数据库系统来存储数据。常见的数据库系统包括MySQL、SQLite和MongoDB等。

在Python中,我们可以使用相应的数据库驱动程序(如mysql-connector-pythonsqlite3pymongo)来连接数据库并执行操作。

使用SQLite数据库存储数据的示例代码

SQLite基本语法

在这里插入图片描述

创建表格:

使用CREATE TABLE语句创建新的表格。指定表格的名称和列定义。每个列都包括列名和数据类型。你还可以为特定的列指定约束条件。例如:

CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    age INTEGER DEFAULT 0
);

示例中,我们创建了一个名为"users"的表格,包含id、name和age三个列。id列被定义为主键(PRIMARY KEY),name列被定义为非空(NOT NULL),age列设置了默认值为0。

插入数据:

使用INSERT INTO语句插入新的数据行。指定表格名称和要插入的值。你可以插入指定的列或者省略列名插入所有列。例如:

INSERT INTO users (name, age) VALUES ('Alice', 25);

或者省略列名插入所有列:

INSERT INTO users VALUES (1, 'Alice', 25);

这将在"users"表格中插入一行数据,其中name列的值为’Alice’,age列的值为25。

查询数据:

使用SELECT语句从表格中检索数据。指定所需的列和表格名称。你还可以使用WHERE子句添加筛选条件。例如:

SELECT * FROM users;

这将检索出"users"表格中的所有列和行。

SELECT name, age FROM users WHERE age >= 20;

这将返回"users"表格中age列大于或等于20的行,并且只包括name和age两列。

更新数据:

使用UPDATE语句更新表格中的数据。指定表格名称、要更新的列和新值,以及更新条件。例如:

UPDATE users SET age = 30 WHERE name = 'Alice';

这将把"users"表格中名为’Alice’的行的age列更新为30。

删除数据:

使用DELETE FROM语句从表格中删除数据。指定表格名称和删除条件。例如:

DELETE FROM users WHERE age < 18;

这将从"users"表格中删除所有age列小于18的行。

条件查询:

使用WHERE子句来添加条件,对查询结果进行筛选。可以使用比较运算符(如=、<、>)和逻辑运算符(如AND、OR、NOT)组合多个条件。例如:

SELECT * FROM users WHERE age >= 20 AND age < 30;

这将返回"users"表格中age列大于等于20且小于30的行。

排序:

使用ORDER BY子句对查询结果进行排序。指定要排序的列和排序顺序(升序ASC或降序DESC)。例如:

SELECT * FROM users ORDER BY age DESC;

这将按照age列的降序对"users"表格中的行进行排序。

这里只是对常用的SQLite语法进行了介绍。实际上,SQLite还支持更多的功能和语法,例如连接操作、聚合函数(如SUM、AVG等)、子查询、联合查询等等。

代码案例

import sqlite3

conn = sqlite3.connect("data.db")
cursor = conn.cursor()

sql = "INSERT INTO users (name, age) VALUES (?, ?)"
data = [("Alice", 25), ("Bob", 30), ("Charlie", 35)]

cursor.executemany(sql, data)

conn.commit()
conn.close()

例子中,我们首先使用sqlite3.connect()函数连接到名为"data.db"的SQLite数据库,并创建一个游标对象。然后,我们定义了一条SQL语句,用于向名为"users"的表中插入数据。最后,我们使用cursor.executemany()方法批量执行插入操作,并通过conn.commit()保存更改。

未完待续…

未完待续

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

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

相关文章

【雕爷学编程】Arduino动手做(137)---MT8870语音解码

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【uview calendar日历 】如何选择今天之前的数据

在日常工作中&#xff0c;使用uniappuview的ui组件&#xff0c;使用日历组件默认是无法选择当前之前的日期&#xff0c;现在讲下解决的方法 设置 最小的可选日期minDate&#xff0c;最大可选日期maxDate&#xff0c; 默认选中的日期&#xff0c;mode为multiple或range是必须为数…

自定义选项卡组件,选项可插槽html

文件夹xxtabs 四个文件 index暴露 render vue添加虚拟节点到插槽&#xff08;自定义标签结构&#xff09; tabs选项卡整体 abpaneq切换区 tabs.vue <template><div class"gnip-tab"><div class"gnip-tab-nav"><divv-for"(item,…

“sudo”组不存在”或“用户不在 sudoers 文件中。此事将被报告”

解决方法: 使用命令&#xff1a;usermod -a -G sudo tom (换成其他的用户名&#xff0c;也是一个道理)&#xff0c;不过还是不行。 实际解决还是要执行 sudo visudo &#xff0c;在这个文件中去添加用户 这样修改之后&#xff0c;保存并退出&#xff0c;亲测有效&#xff01; …

【FFmpeg实战】AAC编码介绍

AAC&#xff08;Advanced Audio Coding&#xff0c;译为&#xff1a;高级音频编码&#xff09;&#xff0c;是由Fraunhofer IIS、杜比实验室、AT&T、Sony、Nokia等公司共同开发的有损音频编码和文件格式。 对比MP3 AAC被设计为MP3格式的后继产品&#xff0c;通常在相同的比…

训练自己的ChatGPT 语言模型(一).md

0x00 Background 为什么研究这个&#xff1f; ChatGPT在国内外都受到了广泛关注&#xff0c;很多高校、研究机构和企业都计划推出类似的模型。然而&#xff0c;ChatGPT并没有开源&#xff0c;且复现难度非常大&#xff0c;即使到现在&#xff0c;没有任何单位或企业能够完全复…

Atlas200 DK A2与Arduino进行UART串口通信

我们在做一些人工智能的应用开发时往往使用人工智能开发板作为上位机&#xff08;比如我们的小滕&#xff09;&#xff0c;Arduino、stm32等作为下位机控制板&#xff0c;通过上位机进行人工智能模型的推理之后进而给下位机传输对应的控制命令实现智能控制。那么如何实现两者的…

简化交互体验——探索Gradio的ClearButton模块

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

ndarray对象怎样创建?ndarray基本属性列举

numpy中包含一个N维数组对象&#xff0c;即ndarray对象&#xff0c;该对象具有矢量算术能力和复杂的广播能力&#xff0c;常用于科学计算。ndarray对象中的元素可以通过索引访问&#xff0c;索引序号从0开始;ndarray对象中存储的所有元素的类型必须相同。创建ndarray对象的方式…

输入框设置placeholder的文字居中

<input classlogin-form-pwd placeholder请输入商家登录密码 placeholder-class"center"></input> .center{ text-align: center; }

Linux下 MHA故障切换 主从角色提升

目录 所有主机共同操作 manger操作 其他四台安装 搭建主从复制环境 nobe slave1 配置 slave2 slave3 配置 配置MHA环境 简述MHA&#xff1a; MHA&#xff08;Master High Availability&#xff09;目前在MySQL高可用方面是一个相对成熟的解决方案&#xff0c;它由…

MySQL中的DDL操作,MySQL中DML操作,MySQL查询数据,SQL函数,MySQL中的索引,MySQL事务,MySQL的用户管理,MySQL分页查询

目录 MySQL中的DDL操作 一、创建表与删除表 1&#xff0c;创建表 2&#xff0c;查看已创建的表。 3&#xff0c;删除表 二、修改表 1&#xff0c;修改表名 2&#xff0c;修改列名 3&#xff0c;修改列类型 4&#xff0c;添加新列 5&#xff0c;删除指定列 三、MySQ…

劳保鞋厂家带你深入了解防静电安全鞋——百华劳保

静电小则电人&#xff0c;大则引起火灾。静电的能量虽然不大&#xff0c;但其易放电&#xff0c;会出现静电火花&#xff0c;在易燃易爆场所&#xff0c;可能因静电火花引起火灾和爆炸。现在的工厂不少都是要求穿着具有防静电性能的工作鞋&#xff0c;很多劳动者都会穿着防静电…

使用Docker Swarm部署RabbitMQ+HAProxy高可用集群(三节点-镜像模式)

1. 部署规划 当前规划中&#xff0c;只启动一个HAProxy服务&#xff0c;主要用来做RabbitMQ节点的负载均衡和代理&#xff0c;但是HAProxy可能会出现单点故障&#xff0c;后续需要启动多个HAProxy节点&#xff0c;然后结合Keepalived来进行 设置虚拟IP 做故障转移 节点名称节…

nvm安装nodejs-2023年6月29日

nvm安装nodejs-2023年6月29日 cmd命令行&#xff0c;执行如下代码&#xff0c;表示安装最新稳定版本的node,这里默认是国外的node节点服务器 nvm install lts报错的话&#xff0c;找到安装目录&#xff0c;打开settings.txt&#xff0c;添加如下代码 更换node的国内淘宝镜像节…

cnocr安装和识别文字

cnocr 介绍 参考&#xff1a; cnocr: 极简的中文OCR Python包 https://cnocr.readthedocs.io/zh/latest/ cnocr 主要针对的是排版简单的印刷体文字图片&#xff0c;如截图图片&#xff0c;扫描件等。目前内置的文字检测和分行模块无法处理复杂的文字排版定位。如果要用于场景…

《从零开始编写一个直播服务器》音视频封装FLV

流媒体服务系列文章 文章目录 流媒体服务系列文章前言一、FLV 封装格式解析二、实例分析总结 前言 一、FLV 封装格式解析 flv header flv body flv header previous size0 tag1 previous size1 tag2 … prvious sizen tagn1 flv header previous size0 tag1 header ta…

华为OD机试真题 Python 实现【获得完美走位】【2022Q4 200分】

一、题目描述 在第一人称射击游戏中&#xff0c;玩家通过键盘的 A、S、D、W 四个按键控制游戏人物分别向左、向后、向右、向前进行移动&#xff0c;从而完成走位假设玩家每按动一次键盘&#xff0c;游戏任务会向某个方向移动一步&#xff0c;如果玩家在操作一定次数的键盘并且…

经典文献阅读之--Wheel-SLAM(低成本轮式机器人定位算法)

0. 简介 最近随着越来越多的团队开始注重将SLAM应用在机器人和无人驾驶上&#xff0c;最近SLAM的顶刊顶会也开始想着多模态和低成本这两个方向开始发力。而本文讲的这个《Wheel-SLAM: Simultaneous Localization and Terrain Mapping Using One Wheel-mounted IMU》就是讲了如…

Scala中那些奇怪的符号

<- 运算符 用于 for 循环中&#xff0c;如下所示&#xff1a; for ( i <- arr ){println( "i" i ) } -> 只会用在 k->v 里面 // Map 键值对演示 val colors Map("red" -> "#FF0000", "azure" -> "#F0FF…