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

知识储备

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

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,一经查实,立即删除!

相关文章

macos如何安装Tesseract软件and常规应用及问题处理

问题在线过程: 今天在mac系统上安装tesseract持续失败,整了很久终于把这个问题解决了,所以希望通过这篇文章分享给大家: 首先,我在用 brew install tesseract 或 brew install --build-from-source tesseract 一直报错,报错内容如下: Warning: You are using macO…

12-python编写暴力破解poc

一、爆破MD5 场景&#xff1a;已知MD5加密字符串&#xff0c;如何得知明文&#xff1f; 解决方案&#xff1a; 算法碰撞&#xff0c;一串128位的MD5&#xff08;32位16进制&#xff09;其组合数量 字典碰撞&#xff0c;给定一个字典文件&#xff0c;读取里面的密码明文&…

Android system — 链接器命名空间(linker namespace)源码分析

Android system — 链接器命名空间&#xff08;linker namespace&#xff09;源码分析 1. 源码分析2. do_dlopen3. find_library_internal3.1 find_loaded_library_by_soname3.2 load_library3.3 find_library_in_linked_namespace 1. 源码分析 在前一篇文章Android system — …

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

场外个股期权开户新规 场外个股期权开户新规主要涉及对投资者资产实力、专业知识、风险承受能力和诚信记录的要求。以下是根据最新规定总结的关键要点&#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操作系统中&#…

go圣经 ——方法

这里只是记录了自己学过一遍但是在圣经&#xff08;狼吞虎咽&#xff09;中又看到的新鲜玩意 我们又称之为选择器 package mainimport "fmt"type Rect struct {width, height float64 }// 定义一个方法来计算矩形的面积 func (r Rect) Area() float64 {return r.wi…

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

分割字符串问题记录(特殊符号识别问题)

报错代码 String[] split power.split(""); 纠正后代码 String[] split power.split("\\"); 问题解析 String[] split power.split(""); 这段代码本身是符合Java语法规范的&#xff0c;它表示使用""作为分隔符来分割字符串powe…

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

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

windows ubuntu sed,awk,grep篇,6.sed 保持空间和模式空间命令

目录 41.用保持空间替换模式空间(命令 x) 42.把模式空间的内容复制到保持空间(命令 h) 43.把模式空间内容追加到保持空间(命令 H) 44.把保持空间内容复制到模式空间(命令 g) 45.把保持空间追加到模式空间(命令 G) Sed 有两个内置的存储空间&#xff1a; z 模式空间:如你所知&…

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

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

怎么理解JavaScript原型、原型链

原型 JavaScript被描述为一种基于原型的语言&#xff0c;也就是每一个对象都拥有一个原型对象。 当我们访问一个对象的属性时&#xff0c;它不仅仅该改对象上查找&#xff0c;还会到这个对象的原型上查找&#xff0c;甚至是到这个对象的原型的原型上查找&#xff0c;这样一层…

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.给…