利用二叉检索树将文章中的单词建立索引(正则表达式)

知识储备

链接: 【二叉检索树的实现——增删改查、读取命令文件、将结果写入新文件】

1、正则表达式的处理

(1)r’'前缀的作用

r’'前缀的用于定义原始字符串,特点是不会处理反斜杠\作为转义字符
在这里插入图片描述

(2)正则表达式中元字符的用法总结

\d代表任意一个数字,+代表前面的任意数字可以出现多次

在这里插入图片描述

\w代表任意一个字母数字下划线字符,+代表前面的任意可以出现多次

在这里插入图片描述

总结:
.:匹配除了换行符之外的任意单个字符。

例子:正则表达式 a.b 可以匹配到 “axb”、“a1b”、“a-b” 等,但不能匹配到 “aab” 或 “a\nb”(除非设置了多行模式)。

*:匹配前面的子表达式零次或多次。

例子:正则表达式 zo* 可以匹配到 “z” 以及 “zoo”。

+:匹配前面的子表达式一次或多次。

例子:正则表达式 zo+ 匹配 “zoo”,但不匹配 “z”。

?:匹配前面的子表达式零次或一次,也可以用在限定符后面表示非贪婪模式。

例子:正则表达式 do(es)? 可以匹配到 “do” 或 “does”。

^:匹配输入字符串的开始位置。

例子:正则表达式 ^Hello 匹配以 “Hello” 开始的字符串。

$:匹配输入字符串的结束位置。

例子:正则表达式 world$ 匹配以 “world” 结束的字符串。

{}:用大括号 {n} 表示恰好匹配 n 次,{n,} 表示至少匹配 n 次,{n,m} 表示匹配至少 n 次但不超过 m 次。

例子:正则表达式 o{2} 匹配 “oo”,o{2,} 匹配 “oo”、“ooo”、“oooo” 等,o{2,4} 匹配 “oo”、“ooo”、“oooo”。

[]:字符集,匹配方括号中列出的任意一个字符。

例子:正则表达式 [abc] 匹配 “a”、“b” 或 “c”。

^(在字符集中):在字符集中表示取非,匹配未列出的字符。

例子:正则表达式 [^abc] 匹配除了 “a”、“b” 和 “c” 以外的任意字符。

\:转义字符,用于匹配那些具有特殊意义的字符,如 . 匹配点字符本身。

例子:正则表达式 . 匹配点字符本身,而不是任意字符。

\d:匹配一个数字字符,等价于 [0-9]。

例子:正则表达式 \d\d\d 匹配三位数,如 “123”。

\D:匹配一个非数字字符,等价于 [^0-9]。

例子:正则表达式 \D\D\D 匹配三个非数字字符。

\w:匹配任意一个字母数字字符或下划线,等价于 [a-zA-Z0-9_]。

例子:正则表达式 \w+ 匹配一个或多个字母、数字或下划线组成的字符串,如 “hello”、“12345” 或 “hello_world”。

\W:匹配任意一个非字母数字字符或非下划线字符,等价于 [ ^a-zA-Z0-9_ ]。

例子:正则表达式 \W+ 匹配一个或多个非字母、非数字或非下划线的字符。

\s:匹配任何空白字符,包括空格、制表符、换页符等。

例子:正则表达式 \s+ 匹配一个或多个空白字符,如空格、制表符或换行符。

\S:匹配任何非空白字符。

例子:正则表达式 \S+ 匹配一个或多个非空白字符。

\b:匹配一个单词边界,即单词和空格之间的位置。

例子:正则表达式 \bcat\b 匹配独立的单词 “cat”,而不是 “concatenate” 中的 “cat”。

\B:匹配非单词边界的位置。
|:或运算符,匹配 | 符号前后的任意一个表达式。
():捕获括号,用于定义一个子表达式,并获取匹配的文本。

例子:正则表达式 (ab)+ 匹配一个或多个 “ab”,并且可以通过捕获括号提取匹配的内容。

(?..):非捕获括号,用于对匹配进行一些额外的操作,如前向和后向查找。
[…]:字符集内可以使用连字符 - 来表示字符范围,例如 [a-z] 表示小写字母范围。

(3)替换字符串中的模式

在这里插入图片描述

(4)注意:正则表达式中,点号 “.” 代表除了换行符外的任意单个字符,因此要转义,只能通过反斜杠\转义,r’'前缀达不到目的

在这里插入图片描述
同理,?也一样
在这里插入图片描述

2、利用正则表达式分离文本中的单词

利用正则表达式去掉符号、数字等

(1)文本文件

在这里插入图片描述

(2)处理结果

在这里插入图片描述

3、利用二叉树将文章中的所有单词建立索引

(1)具体描述

当一本书的文字量很大时,为其创建索引表是一个繁琐的事情。利用任务 2 中构建的 BST 数据结构,
可以很轻松的创建书稿的索引表。方法如下:将文稿中出现的每个单词都插入到用 BST 构建的搜索表中,
记录每个单词在文章中出现的行号。对于如下的文本段 (左侧列表为行号),构建一个 BST,当调用了该
BST 的 printInOrder 方法之后,输出的内容如图 3 所示,一个按字典排序的索引表就创建好了。
1 Dudley’s birthday – how could he have forgotten? Harry got slowly
2 out of bed and started looking for socks. He found a pair under
3 his bed and, after pulling a spider off one of them, put them on.
4 Harry was used to spiders, because the cupboard under the stairs
5 was full of them, and that was where he slept.
6 When he was dressed he went down the hall into the kitchen. The
7 table was almost hidden beneath all Dudley’s birthday presents. It
8 looked as though Dudley had gotten the new computer he wanted, not
9 to mention the second television and the racing bike. Exactly why
10 Dudley wanted a racing bike was a mystery to Harry, as Dudley was
11 very fat and hated exercise – unless of course it involved
12 punching somebody. Dudley’s favorite punching bag was Harry, but
13 he couldn’t often catch him.
实验材料中准备了一篇英文文稿,文件名为 article.txt1,请按照上面的样例根据该 article.txt 中的内
容构建索引表,并将索引表的内容按照单词的字典序列输出到 indexResult.txt 文件中。构建 BST 中的结点数据时,请认真思考记录行号的数据类型,如果可能,尽量使用之前实验中已构建的数据结构,也是对
已创建的数据结构的一种验证
在这里插入图片描述

(2)article(进展示部分全文共有三万多行)

在这里插入图片描述
在这里插入图片描述

(3)代码实现

对Elem()类、BST()中序遍历方法做了修改
增加了添加索引的函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)代码注意点

(1)

在这里插入图片描述

(2)
  1. lambda x: int(x.strip(‘"’))
    这是一个匿名函数,它接受一个参数 x,并返回 int(x.strip(‘"’)) 的结果。在 lambda 函数内部,x.strip(‘"’) 用于去除字符串 x 两端的双引号,然后 int() 函数将其转换为整数。
  2. map(lambda x: int(x.strip(‘"’)), arr)
    这里使用了 map 函数,它将 lambda 函数应用于列表 arr 中的每个元素。即对于列表 arr 中的每个字符串元素,都会执行 lambda 函数,将其转换为整数。
  3. list(…)
    最后,list 函数用于将 map 函数的结果转换为列表,这样我们就得到了包含转换后整数的列表。
    在这里插入图片描述
对比:

在这里插入图片描述

全部代码

import re
class Elem():def __init__(self,val):if val is not None:#把要插入的元素提取出来self._key = val[1:-1].strip().split(',')[0]#这里由于要把行号全部记录下来,因此要建立一个数组把后面的行号也append进来self._value=[val[1:-1].strip().split(',')[1]]else:self._key=Nonedef key(self):#获取key()return self._keydef value(self):return self._valuedef set_key(self, key):self._key = keydef set_value(self, value):#将后面的行号append进来for x in value:self._value.append(x)class BinNode:def __init__(self, val):self.left = Noneself.right = Noneself.val = valclass BST():def __init__(self):self.root=Nonedef search_node(self, root, key):if root is None:return Noneit = root.valif it.key() > key:return self.search_node(root.left, key)elif it.key() < key:return self.search_node(root.right, key)return root.val  # 返回节点对象def insert(self,elem):self.root=self._insert(self.root,elem)# _代表私有函数 辅助insert函数实现插入操作def _insert(self,root,elem):if root is None:return BinNode(elem)it=root.val#rooot.val是一个Elem()对象if it.key()>elem.key():root.left=self._insert(root.left,elem)elif it.key()<elem.key():root.right=self._insert(root.right,elem)if it.key()==elem.key():#如果key值相同就替换self.update(elem.key(),elem.value())# root.val=elemreturn rootdef update(self, key, value):node = self.search_node(self.root, key)if node is not None:node.set_value(value)return Trueelse:return Falsedef printInorder(self, outputFile):with open(outputFile, 'w', encoding='utf-8') as f:self._printInorder(self.root, f)def _printInorder(self, root, outputFile):if root is not None:self._printInorder(root.left, outputFile)# outputFile.write(f'[{root.val.key()} ---- < {root.val.value() } >]\n')#这里做了修改,把数组中的元素放出来outputFile.write(f'[{root.val.key()} ---- < {" ".join(x for x in root.val.value())} >]\n')self._printInorder(root.right, outputFile)bst=BST()
with open('article.txt','r')as f:line_numb=1#创建标签——行号for line in f:line_strip=line.strip()#去掉前后空格line_opt=re.sub(r'\d+|\.|,|:|;|!|\?|"|&|-|\'|\*|\(|\)|','',line_strip)#去掉无用符号和数字# print(line_opt)words=line_opt.split()# print(words)for word in words:#将元素插入二叉树bst.insert(Elem(f'({word},{line_numb})'))line_numb+=1bst.printInorder('indexResult.txt')  # 将结果打印出来

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

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

相关文章

场外个股期权开户新规及操作方法

场外个股期权开户新规 场外个股期权开户新规主要涉及对投资者资产实力、专业知识、风险承受能力和诚信记录的要求。以下是根据最新规定总结的关键要点&#xff1a; 来源/&#xff1a;股指研究院 资产门槛&#xff1a;投资者需具备一定的资产实力&#xff0c;确保在申请开户前…

【Linux】文件打包解压_tar_zip

文章目录 &#x1f4d1;引言&#xff1a;一、文件打包压缩1.1 什么是文件打包压缩&#xff1f;1.2 为什么需要文件打包压缩&#xff1f; 二、打包解压2.1 zip2.2 unzip2.3 tar指令 &#x1f324;️全篇小结&#xff1a; &#x1f4d1;引言&#xff1a; 在Linux操作系统中&#…

OpenCV-Python: 强大的计算机视觉库

文章目录 OpenCV-Python: 强大的计算机视觉库背景OpenCV-Python是什么&#xff1f;安装简单的库函数使用方法场景示例人脸检测和识别图像分割目标跟踪 常见问题和解决方案总结 OpenCV-Python: 强大的计算机视觉库 背景 OpenCV (Open Source Computer Vision Library) 是一个开…

如何修改php版本

我使用的Hostease的Windows虚拟主机产品,由于网站程序需要支持高版本的PHP,程序已经上传到主机&#xff0c;但是没有找到切换PHP以及查看PHP有哪些版本的位置&#xff0c;因此咨询了Hostease的技术支持&#xff0c;寻求帮助了解到可以实现在Plesk面板上找到此切换PHP版本的按钮…

基于Springboot+Vue的Java项目-火车票订票系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

GDPU 算法分析与设计 天码行空5

一、【实验目的】 &#xff08;1&#xff09;熟悉动态规划算法的基本思想. &#xff08;2&#xff09;理解动态规划算法中子问题的划分和递推方程设计的基本方法. &#xff08;3&#xff09;熟悉矩阵链乘法的基本思想并编程实现。 二、【实验内容】 输入:矩阵链Ai…j的输入为…

Power BI:如何将文件夹批量Excel(多sheet页)文件导入?

故事背景&#xff1a; 业务同事想用Power BI分析近两年市场费用。 数据源全部是Excel文件&#xff0c;并且以每月一个Excel文件的方式&#xff0c;统一存放到同一文件夹下面。 重点&#xff0c;每张Excel文件会有多张sheet页&#xff0c;用区分每家分公司的费用信息。 目前…

Linux之进程间通信(二)

system V system V共享内存是内核中专门设计的通信的方式, 粗粒度划分操作系统分为进程管理, 内存管理, 文件系统, 驱动管理.., 粒度更细地分还有 进程间通信模块. 对于操作系统, 通信的场景有很多, 有以传送数据, 快速传送数据, 传送特定数据块, 进程间协同与控制以目的, 它…

数字信号的产生与检测——DSP学习笔记六

本专栏的博客的图片大部分来源于老师的PPT&#xff0c;本博客只是博主对于上课内容的知识结构的分析和梳理。 几种数字信号的产生 正弦波信号 多项式逼近(除了泰勒展开&#xff0c;还有一种方法是切比雪夫逼近法&#xff0c;感兴趣可以自己去了解一下&#xff09; 查找表 核心思…

<计算机网络自顶向下> Internet Protocol

互联网中的网络层 IP数据报格式 ver: 四个比特的版本号&#xff08;IPV4 0100, IPV6 0110&#xff09; headlen&#xff1a;head的长度&#xff08;头部长度字段&#xff08;IHL&#xff09;指定了头部的长度&#xff0c;以32位字&#xff08;4字节&#xff09;为单位计算。这…

Java数组深度剖析:掌握数据结构的基石

引言 在编程世界中&#xff0c;数仅仅是一种数据类型&#xff0c;它是理解内存分配、多维数据处理以及性能优组像是构建复杂数据结构的基本积木。它们简洁、高效&#xff0c;是管理元素集的首选方式。在Java中&#xff0c;数组不化的关键。 这篇文章致力于深入探讨Java数组的各…

git出错、文件无法删除、文件无法访问、文件或目录损坏且无法读取 等相关问题处理

一、错误历程与解决方案 1. 在用idea时&#xff0c;突然出现 部分git的命令无法使用&#xff0c;提示错误 2. 尝试删除项目文件夹&#xff0c;重新从git拉取代码 3.发现无法删除文件夹&#xff0c;删除操作没有任何反应&#xff0c;但是可以对文件夹重命名。 4.重新clone g…

李沐70_bert微调——自学笔记

微调BERT 1.BERT滴哦每一个词元返回抽取了上下文信息的特征向量 2.不同的任务使用不同的特性 句子分类 将cls对应的向量输入到全连接层分类 命名实体识别 1.识别应该词元是不是命名实体&#xff0c;例如人名、机构、位置 2.将非特殊词元放进全连接层分类 问题回答 1.给…

QT c++ 代码布局原则 简单例子

本文描述QT c widget代码布局遵循的原则&#xff1a;实中套虚&#xff0c;虚中套实。 本文最后列出了代码下载链接。 在QT6.2.4 msvc2019编译通过。 所谓实是实体组件&#xff1a;比如界面框、文本标签、组合框、文本框、按钮、表格、图片框等。 所谓虚是Layout组件&#x…

Redis哈希槽和一致性哈希

前言 单点的Redis有一定的局限&#xff1a; 单点发生故障&#xff0c;数据丢失&#xff0c;影响整体服务应用自身资源有限&#xff0c;无法承载更多资源分配并发访问&#xff0c;给服务器主机带来压力&#xff0c;性能瓶颈 我们想提升系统的容量、性能和可靠性&#xff0c;就…

sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步 ⏱️ 创作时…

unity的特性AttriBute详解

unity的特性AttriBute曾经令我大为头疼。因为不动使用的法则&#xff0c;但是教程都是直接就写&#xff0c;卡住就不能继续学下去。令我每一次看到&#xff0c;直接不敢看了。 今天使用文心一言搜索一番&#xff0c;发现&#xff0c;恐惧都是自己想象的&#xff0c;实际上这个…

Kotlin泛型之 循环引用泛型(A的泛型是B的子类,B的泛型是A的子类)

IDE(编辑器)报错 循环引用泛型是我起的名字&#xff0c;不知道官方的名字是什么。这个问题是我在定义Android 的MVP时提出来的。具体是什么样的呢&#xff1f;我们看一下我的基础的MVP定义&#xff1a; interface IPresenter<V> { fun getView(): V }interface IVie…

Nodejs 第六十八章(远程桌面)

远程桌面 远程桌面&#xff08;Remote Desktop&#xff09;是一种技术&#xff0c;允许用户通过网络远程连接到另一台计算机&#xff0c;并在本地计算机上控制远程计算机的操作。通过远程桌面&#xff0c;用户可以在不同地点的计算机之间共享屏幕、键盘和鼠标&#xff0c;就像…

宝塔面板安装教程(linux)

宝塔官网地址 宝塔官网linux安装地址 针对Ubuntu系统的安装命令&#xff1a; wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 安装过程中&#xff0c;中途会出现一个 Y&N ? 的选项&#xf…