第6章:6.3.3 正则表达式的应用 (MATLAB入门课程)

news2024/11/26 21:24:46

  讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​

MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili


到目前为止,我们已经系统地介绍了正则表达式的基本语法,以及如何通过regexp函数利用这些语法规则来匹配和提取特定文本。注意,关于regexp函数的用法我们并没有进行系统的讲解,它的完整的使用方法非常丰富,除了常用的'match'和'tokens'参数外,它还支持其他一些输入参数,但使用的频率较低。感兴趣的同学可以查阅MATLAB的官方文档进行自学。

在本小节中,我们将通过解决三道综合性的题目来进一步展示正则表达式在实际应用中的强大功能。这三道例题不仅会巩固你对正则表达式基础语法的理解,还将帮助你把这些概念应用于解决实际问题,从而更好地理解正则表达式的实际应用价值和潜力。

例题1:整理王者荣耀的英雄资料

本章配套的代码压缩包中有一个名为“王者荣耀英雄资料”的文件夹,大家可以看本书的第一页下载。该文件夹中存放着王者荣耀游戏中117名英雄的介绍资料,这些资料来自于王者荣耀的官网(txt文件中的字符编码为UTF-8)。

我们需要提取各位英雄的称号、英雄名称、生存能力、攻击伤害、技能效果和上手难度。

以英雄“白起”为例,我们所需的六个指标位于箭头所指的位置:

   为了提取这些信息,我们提供了以下MATLAB代码示例:

% 确保MATLAB的当前文件夹位于【王者荣耀英雄资料】这个文件夹下
feature('DefaultCharacterSet','UTF-8');   % 防止中文乱码
S = strings(117,6);
for ii = 1:117
    % 使用char函数将文件名更改为字符向量类型(防止低版本MATLAB报错)
    s = fileread(char(ii+".txt"));  
    expression  = ['cover-title">(.+?)<.+?' ...
                    'cover-name">(.+?)<.+?' ...
                    'width:(.+?)">.+?' ...
                    'width:(.+?)">.+?' ...
                    'width:(.+?)">.+?' ...
                    'width:(.+?)">'];
    s1 = regexp(s, expression, 'tokens');
    s2 = string(s1{1});
    S(ii,:) = s2;
end
S

运行上述代码后,得到的S是一个117行6列的字符串数组。其中,第一列的部分数据中存在错误:

例如第13行第1列的数据为:

我们可以打开对应的txt文件来查看出错的原因,以“13.txt”为例:

和一般的文件相比,这里多了一个网页标签: <span class="cover-title-inner">,而我们上面的正则表达式没考虑到这种情况,因此会导致匹配到多余的文本。

为解决这一问题,我们提供了两种解决方案:

(1)对已提取的字符串数组S进行二次处理,删除掉不需要的部分

除了使用eraseBetween函数之外,我们也可以使用另外一个正则表达式函数regexprep来解决这个问题,它的用法如下:newStr = regexprep(str,expression,replace) 将 str 中与 expression 匹配的文本替换为 replace 描述的文本。regexprep 函数在 newStr 中返回更新的文本。

上述两种方法得到的结果完全相同。

(2)调整正则表达式,其余的代码不变,运行后得到的S就是所需的正确结果

expression = ['cover-title">(?:<span class="cover-title-inner">)?(.+?)<.+?' ...
              'cover-name">(.+?)<.+?' ...
              'width:(.+?)">.+?' ...
              'width:(.+?)">.+?' ...
              'width:(.+?)">.+?' ...
              'width:(.+?)">'];

调整后的正则表达式通过加入一个非捕获组(?:<span class="cover-title-inner">)?,使得正则表达式能够匹配到可能存在的<span class="cover-title-inner">文本,并将其作为可选部分进行处理。

例题2:提取《西游记》章回概述中的标题并统计每一回的字符数

本题将使用正则表达式的相关知识重新解决上一章5.4.5节的案例3,大家可以打开本章配套文件中的“西游记数据”这个子文件夹,并将MATLAB的当前文件夹切换到这个文件夹内。本题所需的数据保存在 “《西游记》章回内容梗概.txt”这个文件中。

任务一比较简单,我们直接给出相应的代码:

% 确保MATLAB的当前文件夹位于【西游记数据】这个文件夹下
feature('DefaultCharacterSet','UTF-8');   % 防止中文乱码
s = fileread('《西游记》章回内容梗概.txt');
H = regexp(s,'第\w*?回\s*(.*?)\n','tokens'); 
H = strip(string(H))  % 将H转换成字符串类型,并删除掉前后的空白字符
% 得到的结果和上一章的代码完全相同

对于任务二,为了统计每一回正文的字数,下面我们采用了一种创新的策略。为了清晰地区分每一回的开始和结束,我们预先在“第”字前插入一个特殊字符(使用unicode编码为9999对应的字符)。这个预处理步骤简化了后续的文本分析,使我们能够更精确地使用正则表达式提取每一回的正文内容。然后,通过去除所有换行符和回车符,并计算剩余文本的字符数,我们得到了每一回正文的字数。这一过程的代码如下所述:

ss = s;  % 将原来的数据赋值给ss,后面我们对ss进行修改时不会影响到s
% count(ss,'第')  % 结果等于100
ss = regexprep(ss,'第',[char(9999), '第']);  % 在'第'的前面插入一个特殊字符
% 下面我们借助正则表达式的捕获组来获取每一回的正文内容
s1 = regexp([ss, char(9999)], ...
            ['第\w*?回.*?\n(.*?)', char(9999)],'tokens'); 
s2 = regexprep(string(s1),'[\n\r]','');   % 删除掉换行符和回车符
N = strlength(s2)   % 统计字符数(得到的结果和上一章完全相同)

这个解决方案不仅展示了MATLAB正则表达式处理文本数据的强大能力,也体现了在文本分析任务中面对复杂问题时的创造性思维。

例题3:导入人口统计数据

本题数据来自国家统计局发布的《第七次全国人口普查公报(第五号)》:

第七次全国人口普查公报(第五号) - 国家统计局

大家可以在上述网页中找到下面这张表格:

我们的任务是将上述表格中的数据保存到MATLAB中。

为了完成这个任务,我们可以依次完成如下三个步骤:

第一步:将表格上的数据复制粘贴到文本文件中

大家可以新建一个txt后缀的文本文件,然后在网页中复制所需的数据部分(上图用红色框选的部分),将复制的内容粘贴到这个txt文件中。

例如,我创建的txt文件名为“各地区人口年龄构成.txt”,该文件的编码为UTF-8,大家可以在本章配套的代码压缩包中找到。

第二步:读取txt文件中的数据到MATLAB

第三步:从字符串s中提取所需的数据

注意,提取的方法并不唯一,下面我们使用正则表达式进行提取,你也可以使用我们上一章所学的知识点。

s1 = regexp(s,'[一-龥]\s?[一-龥]{1,2}','match')  % 提取地区名称

注意:'一'和'龥'分别是汉字在Unicode编码中的第一个字符和最后一个字符,所以正则表达式'[-]'可用于匹配单个的汉字。另外,提取得到的两个字的地区名称中间的空格并不是普通的空格(Unicode编码为32),而是全角空格(Unicode编码为12288),因此大家如果将正则表达式中的\s换成普通的空格会得到错误的结果。


  点击下方的CSDN专栏阅读下一篇文章:

MATLAB入门课程专栏

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

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

相关文章

Bytebase 2.15.0 - GitOps 整体升级

&#x1f514; GitOps 整体升级 新版 GitOps 和之前版本不兼容&#xff0c;如果需要升级协助&#xff0c;请联系我们。 使用访问令牌进行身份验证。支持项目中配置多个 VCS 连接器。支持在 VCS 连接器中指定数据库分组为目标&#xff08;默认情况下应用于项目中的所有数据库&…

uni-app实现下拉刷新

业务逻辑如下&#xff1a; 1.在滚动容器中加入refresher-enabled属性&#xff0c;表示为开启下拉刷新 2.监听事件&#xff0c;添加refresherrefresh事件 3.在事件监听函数中加载数据 4.关闭动画&#xff0c;添加refresher-triggered属性&#xff0c;在数据请求前开启刷新动画…

自营商城上货采集,上货软件采集(淘宝1688)接口

自营商城上货采集及上货软件采集涉及到淘宝和1688等平台的接口时&#xff0c;主要流程包括确定数据源、申请API权限、编写自动化采集脚本以及后续的数据处理和商城上货。 taobao.item_get-获取淘宝商品数据接口返回值说明 1.请求方式&#xff1a;HTTP POST GET &#xff08;复…

信息学奥赛一本通T1441-生日蛋糕【dfs】

信息学奥赛一本通T1441-生日蛋糕 - C语言网 (dotcpp.com) #include <iostream> #include <algorithm> #include <cmath> using namespace std; const int N1e5100; int n,m; int res1e9; void dfs(int spv,int cnt,int r,int h,int sarea) //spv:剩余的体积&…

【电控笔记0】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结

Codeforces Round 521 (Div. 3)

目录 A. Frog Jumping B. Disturbed People C. Good Array D. Cutting Out E. Thematic Contests F1. Pictures with Kittens (easy version) F2. Pictures with Kittens (hard version) A. Frog Jumping 直接模拟即可注意数据范围需要开long long void solve(){LL a,…

【七 (2)FineBI-平台新增用户留存分析】

目录 文章导航一、字段解释1、用户平台登录信息表格2、用户平台激活信息表格 二、需求三、操作步骤1、建立用户平台登录信息表格和用户平台激活信息表格的关联关系2、将用户平台激活信息表格的激活日期添加到用户平台登录信息表格3、新增公式列&#xff0c;计算激活时间和登录时…

超详细的YOLOv8项目组成解析:一站式指南了解其架构与组件

目录 yolov8导航 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; 项目结构 1. .github 2. docker 2.1 docker/Dockerfile 2.2 docker/Dockerfile-arm64 2.3 docker/Dockerfile-conda 2.4 docker/Dockerfile-cpu 2.5 docker/Dockerfile-jetson 2.6 docker/D…

SQLite 在Android安装与定制方案(十七)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite超详细的编译时选项&#xff08;十六&#xff09; 下一篇&#xff1a;SQLite Android 绑定&#xff08;十八&#xff09; 安装 有三种方法可以将 SQLite Android 绑定添加到应用程序&#xff1a; 1、通过…

【linux深入剖析】动态库的使用(续) | 动静态库的链接

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 回顾1. 打包库的使用2. 动…

MATLAB如何分析根轨迹(rlocus)

根轨迹分析是一种图形化方法&#xff0c;用于研究闭环极点随系统参数&#xff08;通常是反馈增益&#xff09;变化时的移动情况。 绘制根轨迹目的就是改变系统的闭环极点,使得系统由不稳定变为稳定或者使得稳定的系统变得更加稳定。 主导极点 主导极点就是离虚轴最近的闭环极…

vmware虚拟机进不去系统补救

更新了虚拟机里面工具和资料&#xff0c;进行了磁盘整理和压缩&#xff0c;虚拟机运行进不去系统了。 网站找的修复方法均不可行。补救措施&#xff1a;利用DiskGenius.exe&#xff08;要用高版本不然复制的时候就知道了&#xff09; DG1342.rar - 蓝奏云 加载虚拟硬盘 2008x…

适用于 Mac 的 10 大数据恢复工具,具有优点、缺点

数据丢失很常见&#xff0c;并且可能由于许多不同的原因而发生。这种情况在我和我们团队的其他成员身上发生过很多次&#xff0c;即使我们格外小心我们的个人存储设备。 幸运的是&#xff0c;数据恢复软件在大多数情况下都可以工作。但是&#xff0c;由于数据丢失场景彼此之间…

java Web 中小企业门户网站用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 中小企业门户网站是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

MySQL如何定位慢查询?如何分析这条慢查询?

常见的慢查询 聚合查询&#xff08;常用的聚合函数有&#xff1a;MAX&#xff08;&#xff09;、MIN&#xff08;&#xff09;、COUNT&#xff08;&#xff09;、SUM&#xff08;&#xff09;、AVG&#xff08;&#xff09;&#xff09;。 多表查询 表数据过大查询 深度分页…

刷题之动态规划-两个数组

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的两个数组类型相关的题目 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么>dp[i]表示什么状态转移方程&#xff1a; dp[i] 等于什么1 和 2 是动态规划的核心步骤&#xff0…

APP下载页前端自适应HTML源码

源码介绍 APP下载页前端自适应HTML源码&#xff0c;可以作为自己的软件介绍页或者app下载页&#xff0c;喜欢的朋友可以拿去研究 效果预览 HTML源码下载 https://www.qqmu.com/3026.html

SpringCloud集成SkyWalking链路追踪并收集日志2

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

第6章 6.1.1 文本格式化 sprintf函数(MATLAB入门课程)

sprintf函数源自 C 语言标准库中的同名函数&#xff0c;这个函数在 C 语言中用于创建格式化的字符串&#xff0c;且使用频率非常高。作为一门高级编程语言&#xff0c;MATLAB借鉴了 C 语言和其他编程语言中的许多特性和命名惯例。在MATLAB中&#xff0c;sprintf函数主要有两种用…

使用unicloud-map 无法展示poi的天坑

天坑&#xff01;天坑&#xff01;天坑 使用unicloud-map的天坑 202404121722&#xff0c;昨天晚上发现uni-admin中导入了unicloud-map管理端之后在chrome浏览器由于地图定位失败&#xff0c;一直没有办法新增poi,不过后面发现safari浏览器是可以定位出来的&#xff0c;所以今…