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 re

result_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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】MySQL复合查询--多表查询自连接子查询 - 副本

文章目录 1.基本查询回顾2.多表查询3.自连接4.子查询 4.1单行子查询4.2多行子查询4.3多列子查询4.4在from子句中使用子查询4.5合并查询 4.5.1 union4.5.2 union all 1.基本查询回顾 表的内容如下&#xff1a; mysql> select * from emp; ----------------------------…

ubuntu安装新版本的CMake

来到cmake官网选择版本 我需要在嵌入式板子上的Ubuntu18安装使用 故我选择aarch64版本。 按F12进入检查模式得到下载链接。 在板子上运行以下命令&#xff0c;获取安装脚本 wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-aarch64.s…

Django模板(四)

一、include标签 加载一个模板,并在当前上下文中进行渲染。这是一种在模板中 “包含” 其他模板的方式 简单的理解:在当前模板中引入另外一个模板内容 1.1、使用方法 模板名称可以是变量,也可以是单引号或双引号的硬编码(带引号)的字符串 {% include "foo/bar.ht…

接口自动化测试之HTTP协议详解

协议 简单理解&#xff0c;计算机与计算机之间的通讯语言就叫做协议&#xff0c;不同的计算机之间只有使用相同的协议才能通信。所以网络协议就是为计算机网络中进行数据交换而建立的规则&#xff0c;标准或约定的集合。 OSI模型 1978年国际化标准组织提出了“开放系统互联网…

BerDiff: Conditional Bernoulli Diffusion Modelfor Medical Image Segmentation

BerDiff:用于医学图像分割的条件伯努利扩散模型 摘要&#xff1a; 医学图像分割是一项具有挑战性的任务&#xff0c;具有固有的模糊性和高度的不确定性&#xff0c;这主要是由于肿瘤边界不明确和多个似是而非的注释等因素。分割口罩的准确性和多样性对于在临床实践中为放射科…

【UVM_Introduction Factory_2024.02.28】

Introduction 通用验证方法学UVM&#xff08;2014年1.2版本延续至今&#xff09; 作用&#xff1a; 降低验证工程复杂度&#xff0c;保证验证可靠性&#xff0c;提升验证效率 提供一套标准的类库&#xff0c;减轻环境构建的负担&#xff0c;更多的投入制定验证计划和创建测试场…

springboot228高校教师电子名片系统

高校教师电子名片系统的设计与实现 摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;名片信息因为其管理内容繁杂&#xff0c;管理数…

【数据结构】数组

第一章、为什么数组的下标一般从0开始编号 提到数组&#xff0c;读者肯定不陌生&#xff0c;甚至还会很自信地说&#xff0c;数组很简单。编程语言中一般会有数组这种数据类型。不过&#xff0c;它不仅是编程语言中的一种数据类型&#xff0c;还是基础的数据结构。尽管数组看起…

代码随想录算法训练营29期|day64 任务以及具体安排

第十章 单调栈part03 有了之前单调栈的铺垫&#xff0c;这道题目就不难了。 84.柱状图中最大的矩形class Solution {int largestRectangleArea(int[] heights) {Stack<Integer> st new Stack<Integer>();// 数组扩容&#xff0c;在头和尾各加入一个元素int [] ne…

半小时到秒级,京东零售定时任务优化怎么做的?

导言&#xff1a; 京东零售技术团队通过真实线上案例总结了针对海量数据批处理任务的一些通用优化方法&#xff0c;除了供大家借鉴参考之外&#xff0c;也更希望通过这篇文章呼吁大家在平时开发程序时能够更加注意程序的性能和所消耗的资源&#xff0c;避免在流量突增时给系统…

【web APIs】3、(学习笔记)有案例!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、概念其他事件页面加载事件元素滚动事件页面尺寸事件 元素尺寸与位置 二、案例举例电梯导航 前言 掌握阻止事件冒泡的方法理解事件委托的实现原理 一、概念…

【MATLAB源码-第151期】基于matlab的开普勒化算法(KOA)无人机三维路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 开普勒优化算法&#xff08;Kepler Optimization Algorithm, KOA&#xff09;是一个虚构的、灵感来自天文学的优化算法&#xff0c;它借鉴了开普勒行星运动定律的概念来设计。在这个构想中&#xff0c;算法模仿行星围绕太阳的…

免费网站搭建

免费网站搭建 一.领取一个免费域名和SSL证书&#xff0c;和CDN 特点&#xff1a;支持Cloudflare CDN Cloudflare是全球知名的CDN提供商&#xff0c;如果你不想暴露你的源站&#xff0c;又想使用我们的二级域名&#xff0c;不需要前往Cloudflare添加域名&#xff0c;修改NS记录…

特斯拉掀起「端到端」风暴,自动驾驶持续开卷

作者 |三少爷 编辑 |祥威 最近&#xff0c;特斯拉向在美用户推送了版本号为V12.1.2 Beta的端到端FSD&#xff0c;版本推送后&#xff0c;海外的特斯拉车主和视频博主上传了一些测试视频&#xff0c;测评视频本身没有太多好说的&#xff0c;真正值得关注的是「端到端」。 自马…

C++ 之LeetCode刷题记录(三十五)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], num…

(2024,Sora 逆向工程,DiT,LVM 技术综述)Sora:大视觉模型的背景、技术、局限性和机遇回顾

Sora: A Review on Background, Technology, Limitations, and Opportunities of Large Vision Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 背景 2.1…

「算法」前缀和

前缀和主要解决求数组中某段区间元素和的问题&#xff0c;使用前缀和解决问题的步骤如下: 预处理一个前缀和数组使用这个数组 一维前缀和 现在有一个一维数组nums 预处理前缀和数组 定义一个数组 dp[]&#xff0c;dp[i]表示 nums 中 [0,i-1] 区间的元素和&#xff0c;那我们…

《互联网的世界》第二讲-最短路径优先

昨天讲 dns 时讲过&#xff0c;“你问一个当地人最近的厕所在哪&#xff0c;路人给你一个地址…”&#xff0c;可是只有地址还不够&#xff0c;如何到达那里呢&#xff1f;这是本节的内容。 自然的方式是&#xff0c;一边走一边问&#xff0c;根据路人的指示继续一边走一边问…

Cap0:TensorRT环境搭建

文章目录 1、安装TensorRT1.1、下载TensorRT压缩包1.2、配置环境变量 2、测试2.1、测试源码2.2、编译源码 1、安装TensorRT TensorRT是针对NVIDIA显卡设备的加速方案&#xff0c;你要使用TensorRT则证明你有一定的深度学习基础&#xff0c;那么在你的Ubuntu上配置好显卡驱动、…

Vue.js实战:构建一个简单的学生管理系统

摘要&#xff1a; 本文将引导你使用Vue.js框架来构建一个完整的学生管理系统。我们将从环境搭建开始&#xff0c;逐步介绍Vue的核心概念、组件创建、数据管理、事件处理、路由配置以及项目构建等关键步骤。通过实际操作&#xff0c;你将能够掌握Vue.js的基础知识&#xff0c;并…