Python中re(正则)模块的使用

re 是 Python 标准库中的一个模块,用于支持正则表达式操作。通过 re 模块,可以使用各种正则表达式来搜索、匹配和操作字符串数据。

使用 re 模块可以帮助在处理字符串时进行高效的搜索和替换操作,特别适用于需要处理文本数据的情况。

# 导入模块
import re

一、方法

match 从开头匹配 返回match 或者None

r = re.match(r".\w{10}", "Hello_world hi world")
print(type(r), r,)
if r:print(r.group())


findmatch 从开始到位匹配 返回match 或者None

r = re.fullmatch(r"\da", "1a2b3c4d5e6f7g")
print(r)


search 匹配整个字符串 返回Match 或者None

# # search 匹配整个字符串 返回Match 或者None
r = re.search(r"\d", "1a2b3c4d5e6f7g")
print(r)


findall 找到所有 返回列表

r = re.findall(r"..", "he1\tll2o w5ol\nd")
print(type(r), r)


finditer 找到所有 返回迭代器 其中的每一个元素都是Match

# finditer 找到所有 返回迭代器 其中的每一个元素都是Match
r = re.finditer(r"\d\w", "1a2b3c4d5e6f7g")
print(r)
for e in r:print(e)


split 切割 返回列表

# # split 切割 返回列表
r = re.split(r"\d", "1a2b3c4d5e6f7g")
print(r)


sub 替换 返回字符串

# sub 替换 返回字符串
r = re.sub(r"\d", "+", "1a2b3c4d5e6f7g", 3)
print(r)


subn 替换 返回元组(新字符串, 替换个数)

# subn 替换 返回元组(新字符串, 替换个数)
r = re.subn(r"\d", "+", "1a2b3c4d5e6f7g")
print(r)

二、字符匹配

. 匹配任意字符

# . 匹配任意字符
r = re.findall(r"..", "he1\tll2o w5ol\nd")
print(type(r), r)


\d 匹配数字

# \d 匹配数字
r = re.findall(r"\d", "he1\tll2o w5ol\nd+1234/*-+595")
print(type(r), r)


\D 匹配非数字

# \D 匹配非数字
r = re.findall(r"\D", "he1\tll2o w5ol\nd+1234/*-+595")
print(type(r), r)


\w 字母数字下划线

# \w 字母数字下划线
r = re.findall(r"\w", "he1\tll2o w5ol\nd+1234/*-+595")
print(type(r), r)

\W 非字母数字下划线

# \W 非字母数字下划线
r = re.findall(r"\W", "he1\tll2o w5ol\nd+1234/*-+595")
print(type(r), r)


\s 空白字符 空格 制表符

# \s 空白字符 空格 制表符
r = re.findall(r"\s", "he1\tll2o w5ol\nd+1234/*-+595")
print(type(r), r)


\S非空白字符

# \S非空白字符
r = re.findall(r"\S", "he1\tll2o w5ol\nd+1234/*-+595")
print(type(r), r)

三、重复

* 出现0-n次

# *出现0 - n次
r = re.findall(r"\d*", "123456")
print(r)


+ 有1-n次

# + 有1 - n次
r = re.findall(r"\d+", "123456")
print(r)


? 有0或1个

# ? 有0或1个
r = re.findall(r"\d?", "123456")
print(r)


.*默认是贪婪模式(尽可能多匹配)

# .*默认是贪婪模式(尽可能多匹配)
r = re.findall(r".*", "123456")
print(r)


.*?是非贪婪模式(尽可能少匹配)

# .* ?是非贪婪模式(尽可能少匹配)
r = re.findall(r".*?", "123456")
print(r)


{n} 匹配n次


# {n}匹配n次
r = re.findall(r"\d{2}", "123456")
print(r)


{m,n} 匹配m-n次

# {m,n} 匹配m - n次
r = re.findall(r"\d{3,4}", "123456")
print(r)

四、边界

^ 以开头
$ 以结尾

r = re.findall(r"^a.*?d$", "abcd$dd1a2b3c4d5abcd\n123456d\n123456")
print(r)


\b 匹配单词边界
\B 匹配非单词边界

r = re.findall(r".*?\b", "hello world hi python 123456")
print(r)

五、标识符

re.I 忽略大小写
re.M 多行模式: 如果有换行符+

r = re.match(r".\w{10}", "Hello_world hi world", re.I)
print(type(r), r,)
if r:print(r.group())

六、特殊字符

[abcdefg] 只能取一个
[^abcdefg] 不在abcdefg中间
[a-zA-Z0-9_] 所有数字字母下划线 相当于\w

()分组
\n取前面的分组匹配的内容
(|)

小练习:爬取百度贴吧中部分内容

from urllib import request
import reresult_datas = []
res = request.urlopen("https://tieba.baidu.com/t/f/?class=college")
res = res.read().decode()
result = re.findall(r'<a class="each_topic_entrance_item" href="//tieba.baidu.com/t/f/(\d+)" data-fid="\1">(.*?)</a>',res)
# print(result)
for school in result:# print(f"http://tieba.baidu.com/t/f/{school[0]}", school[1])res_school = request.urlopen(f"http://tieba.baidu.com/t/f/{school[0]}")res_school = res_school.read().decode()school_obj = {"name": school[1],"modules": []}modules = re.findall(r'<div class="module_item">(.*?)</ul></div>', res_school)# print(len(modules))for module in modules:module_name = re.findall(r'<p class="module_name">(.*?)</p>', module)[0]nums = re.findall(r'<div class="thread_item_left">(.*?)</div>', module)titles = re.findall(r'<a class="thread_title" href="//tieba.baidu.com/p/\d+">(.*?)</a>', module)contents = re.findall(r'<div class="thread_content thread_type_word.*?"><p>(.*?)</p><img src=.*?</div>', module)module_obj = {"name": module_name,"items": []}for i in range(len(nums)):module_obj["items"].append({"num": nums[i],"title": titles[i],"content": contents[i]})school_obj["modules"].append(module_obj)result_datas.append(school_obj)with open("result.json", "w", encoding="utf8") as f:json.dump(result_datas, ensure_ascii=False, fp=f)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Shopify如何调取开放接口实现页面更新

Shopify提供了开放接口&#xff08;API&#xff09;&#xff0c;使开发人员能够通过编程方式与Shopify平台进行交互&#xff0c;并实现页面的更新。通过调用API&#xff0c;您可以获取和更新商店的数据&#xff0c;包括产品、订单、顾客信息等。下面是使用Shopify开放接口实现页…

二分图---染色法(判断二分图),匈牙利算法(二分图的最大匹配) //概念,应用场景,判定证明,算法思路,示例

目录 二分图概念 二分图应用场景 如何判定一个图是否可以划分成二分图 证明 染色法 原理步骤 时间复杂度 算法思路 例子 匈牙利算法 概念 匈牙利使用算法前提,场景 时间复杂度 算法思路 例子 二分图概念 二分图是图论中的一个重要概念&#xff0c;指的是一个图的…

APRISO的低代码能力降低MOM系统全生命周期成本

前言 进入21世纪以来企业之间的竞争发生了巨大的变化&#xff0c;特别是近10年来&#xff0c;客户对产品的需求逐渐多样化&#xff0c;制造企业的生产模式也开始由大批量的刚性生产变为了多品种、小批量的柔性生产模式&#xff0c;生产线也从以前的手工方式转为了以自动化的机…

selenium 爬虫的数据实战

引言 众所周知&#xff0c;Python 有很多的爬虫工具&#xff0c;例如&#xff0c;requests、scrapy、selenium等。但是爬虫有个最难搞的东西就是反爬虫了&#xff0c;使用 requests、scrapy框架爬取速度飞快&#xff0c;但是遇到反爬的网站就得斗智斗勇半天甚至好几天。因此&a…

2024年2月深度学习的论文推荐

我们这篇文章将推荐2月份发布的10篇深度学习的论文 Beyond A*: Better Planning with Transformers via Search Dynamics Bootstrapping. https://arxiv.org/abs/2402.14083 Searchformer是一个基于Transformer架构的人工智能模型&#xff0c;经过训练可以模拟A星寻路算法&a…

【重要公告】BSV区块链协会宣布将启动多项动态安全增强措施

​​发表时间&#xff1a;2024年2月16日 2024年2月16日&#xff0c;瑞士楚格 - BSV区块链协议的管理机构BSV区块链协会&#xff08;以下简称“BSV协会”&#xff09;宣布对其运营模式实施全新的安全架构&#xff0c;其中包括引入网络访问规则和数字资产找回协议&#xff0c;以及…

分享一点PDF中获取表格的探索过程

版面分析&#xff1a;如何得到标题、如何的得到段落&#xff08;正确的段落&#xff09;、如何得到表格、如何得到图片&#xff0c;图和得到图片上的文字&#xff1f; 还有细节问题&#xff1a;双栏和多栏的问题、公式问题 扫描件&#xff1a;扫描件本质上是图片&#xff0c;如…

Java 网络通信

两台或多台设备通过一定物理设备连接起来构成了网络。 根据网络的覆盖范围不同&#xff0c;对网络分类&#xff1a; 局域网&#xff1a;覆盖范围小&#xff0c;仅仅覆盖一个教室或一个机房。城域网&#xff1a;覆盖范围较大&#xff0c;可以覆盖一个城市。广域网&#xff1a;…

Python轴承故障诊断 (14)高创新故障识别模型

目录 往期精彩内容&#xff1a; 创新点&#xff1a; 前言 1 模型整体结构 1.1 模型整体结构如下所示&#xff1a; 1.2 创新点详细介绍&#xff1a; 2 轴承故障数据的预处理 2.1 导入数据 2.2 故障FFT变换可视化 2.3 故障VMD分解可视化 2.4 故障数据的特征预处理数据集…

基于B/S+MySQL+Tomcat开发的旅游信息管理系统

基于B/SMySQLTomcat开发的旅游信息管理系统 项目介绍&#x1f481;&#x1f3fb; 塞北村镇旅游网站设计主要用于实现旅游景点信息管理&#xff0c;基本功能包括&#xff1a;主界面模块设计&#xff0c;用户注册模块&#xff0c;旅游景点模块&#xff0c;酒店预订模块&#xff0…

如何利用IP代理高效采集产品数据,打造爆品?

文章目录 一、什么是网络爬虫&#xff1f;二、普通人如何通过网络爬虫赚钱&#xff1f;2.1、心得分享2.2、工具自动化收集信息 三、 动态IP代理3.1、覆盖范围3.2、性价比3.3、教程中心F&Q使用教程 3.4、在网络数据采集中的重要性 四、实战应用案例一&#xff1a;ebay电商【…

C++面试常见八股分享

1.unordered_set和set&#xff0c;unordered_map和map的区别 set 和 map 是 C STL 中的两种关联容器&#xff0c;而 unordered_set 和 unordered_map 是 C11 新增的基于哈希表的关联容器。它们之间的主要区别在于底层的数据结构和操作复杂度。 set 和 unordered_set&#xff1…