一个 Python 的轻量级搜索工具 -- Whose

👇我的小册 40章+教程:(小白零基础用Python量化股票分析小册) ,目前已经300多人订阅

来源丨网络

本文将简单介绍 Python 中的一个轻量级搜索工具 Whoosh,并给出相应的使用示例代码。

# Whoosh 简介

Whoosh 由 Matt Chaput 创建,它一开始是一个为 Houdini 3D 动画软件包的在线文档提供简单、快速的搜索服务工具,之后便慢慢成为一个成熟的搜索解决工具并已开源。

Whoosh 纯由 Python 编写而成,是一个灵活的,方便的,轻量级的搜索引擎工具,现在同时支持 Python2、3,其优点如下:

  • Whoosh 纯由 Python 编写而成,但很快,只需要 Python 环境即可,不需要编译器;

  • 默认使用 Okapi BM25F 排序算法,也支持其他排序算法;

  • 相比于其他搜索引擎,Whoosh 会创建更小的 index 文件;

  • Whoosh 中的 index 文件编码必须是 unicode;

  • Whoosh 可以储存任意的 Python 对象。

Whoosh 的官方介绍网站为:https://whoosh.readthedocs.io/en/latest/intro.html 。相比于 ElasticSearch 或者 Solr 等成熟的搜索引擎工具,Whoosh 显得更轻便,操作更简单,可以考虑在小型的搜索项目中使用。

# Index & query

对于熟悉 ES 的人来说,搜索的两个重要的方面为 mapping 和 query,也就是索引的构建以及查询,背后是复杂的索引储存、query 解析以及排序算法等。如果你有 ES 方面的经验,那么,对于 Whoosh 是十分容易上手的。

按照笔者的理解以及 Whoosh 的官方文档,Whoosh 的入门使用主要是 index 以及 query。搜索引擎的强大功能之一在于它能够提供全文检索,这依赖于排序算法,比如 BM25,也依赖于我们怎样储存字段。因此,index 作为名词时,是指字段的索引,index 作为动词时,是指建立字段的索引。而 query 会将我们需要查询的语句,通过排序算法,给出合理的搜索结果。

关于 Whoosh 的使用,在官文文档中已经给出了详细的说明,笔者在这里只给出一个简单的例子,来说明 Whoosh 如何能方便地提升我们的搜索体验。

# 示例代码

 数据

  本项目的示例数据为 poem.csv,下图为该数据集的前十行:

2a47d874554825b21dcc5c382dc1f681.jpeg
图片
poem.csv

 字段

根据数据集的特征,我们创建四个字段(fields):title, dynasty, poet, content。创建的代码如下:

# -*- coding: utf-8 -*-
import os
from whoosh.index import create_in
from whoosh.fields import *
from jieba.analyse import ChineseAnalyzer
import json

# 创建schema, stored为True表示能够被检索
schema = Schema(title=TEXT(stored=True, analyzer=ChineseAnalyzer()),
                dynasty=ID(stored=True),
                poet=ID(stored=True),
                content=TEXT(stored=True, analyzer=ChineseAnalyzer())
                )

其中,ID 只能为一个单元值,不能分割为若干个词,常用于文件路径、URL、日期、分类;
TEXT 文件的文本内容,建立文本的索引并存储,支持词汇搜索;Analyzer 选择结巴中文分词器。

 创建索引文件

  接着,我们需要创建索引文件。我们利用程序先解析 poem.csv 文件,并将它转化为 index,写入到 indexdir 目录下。Python 代码如下:

# 解析poem.csv文件
with open('poem.csv', 'r', encoding='utf-8') as f:
    texts = [_.strip().split(',') for _ in f.readlines() if len(_.strip().split(',')) == 4]

# 存储schema信息至indexdir目录
indexdir = 'indexdir/'
if not os.path.exists(indexdir):
    os.mkdir(indexdir)
ix = create_in(indexdir, schema)

# 按照schema定义信息,增加需要建立索引的文档
writer = ix.writer()
for i in range(1, len(texts)):
    title, dynasty, poet, content = texts[i]
    writer.add_document(title=title, dynasty=dynasty, poet=poet, content=content)
writer.commit()

index 创建成功后,会生成 indexdir 目录,里面含有上述 poem.csv 数据的各个字段的索引文件。

 查询

index 创建成功后,我们就利用进行查询。
比如我们想要查询 content 中含有明月的诗句,可以输入以下代码:

# 创建一个检索器
searcher = ix.searcher()

# 检索content中出现'明月'的文档
results = searcher.find("content", "明月")
print('一共发现%d份文档。' % len(results))
for i in range(min(10, len(results))):
    print(json.dumps(results[i].fields(), ensure_ascii=False))

输出结果如下:

一共发现44份文档。
前10份文档如下:
{"content": "床前明月光,疑是地上霜。举头望明月,低头思故乡。", "dynasty": "唐代", "poet": "李白 ", "title": "静夜思"}
{"content": "边草,边草,边草尽来兵老。山南山北雪晴,千里万里月明。明月,明月,胡笳一声愁绝。", "dynasty": "唐代", "poet": "戴叔伦 ", "title": "调笑令·边草"}
{"content": "独坐幽篁里,弹琴复长啸。深林人不知,明月来相照。", "dynasty": "唐代", "poet": "王维 ", "title": "竹里馆"}
{"content": "汉江明月照归人,万里秋风一叶身。休把客衣轻浣濯,此中犹有帝京尘。", "dynasty": "明代", "poet": "边贡 ", "title": "重赠吴国宾"}
{"content": "秦时明月汉时关,万里长征人未还。但使龙城飞将在,不教胡马度阴山。", "dynasty": "唐代", "poet": "王昌龄 ", "title": "出塞二首·其一"}
{"content": "京口瓜洲一水间,钟山只隔数重山。春风又绿江南岸,明月何时照我还?", "dynasty": "宋代", "poet": "王安石 ", "title": "泊船瓜洲"}
{"content": "四顾山光接水光,凭栏十里芰荷香。清风明月无人管,并作南楼一味凉。", "dynasty": "宋代", "poet": "黄庭坚 ", "title": "鄂州南楼书事"}
{"content": "青山隐隐水迢迢,秋尽江南草未凋。二十四桥明月夜,玉人何处教吹箫?", "dynasty": "唐代", "poet": "杜牧 ", "title": "寄扬州韩绰判官"}
{"content": "露气寒光集,微阳下楚丘。猿啼洞庭树,人在木兰舟。广泽生明月,苍山夹乱流。云中君不见,竟夕自悲秋。", "dynasty": "唐代", "poet": "马戴 ", "title": "楚江怀古三首·其一"}
{"content": "海上生明月,天涯共此时。情人怨遥夜,竟夕起相思。灭烛怜光满,披衣觉露滋。不堪盈手赠,

94b10431a5e3d2dd128a731bfb7f3420.jpeg

最后推荐一下我们团队写的量化小册的内容,45篇内容!从Python安装,入门,数据分析,爬取股票基金的历史+实时数据,以及如何写一个简单量化策略,策略回测,如何看资金曲线统统都有介绍!非常超值!

欢迎订阅:原价199 早鸟价2杯咖啡钱,即可永久阅读。满400人又要涨价了,现在的价格非常非常低,只要2杯奶茶,就可以终身订阅+课程源码,还有永久陪伴群。48小时无理由退款,放心食用!

065b64638070481e7d3492e423467974.png

推荐阅读:
量化: 如何用Python爬取创业板历史+实时股票数据!|实战股票分析篇利用Pandas 9招挖掘五粮液股价!|实战股票数据分析篇 Pandas滚动操作 |量化股票第一步,用Python画股票K线,双均线图,可视化你的股票数据!|如何用Python爬取全部800多只ETF基金数据!|如何用Python写一个双均线策略 |如何用Python开发一个多策略机器人!上篇!|Python量化系列-用布林策略买五粮液能赚多少钱?|只要4秒钟!用Python 获取上证指数34年的历史日线数据!
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径

干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影

趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!

AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影

小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!

The technology for securely sharing data has grown extensively in recent years. Many users are willing to share their lightweight mobile device data via social networks or the cloud. A novel matchmaking encryption primitive was proposed in CRYPTO’19, whose potential for privacy protection and data sharing security was introduced. However, matchmaking encryption technology faces challenges in flexibly realizing critical functions, such as one-to-many non-interactive scenarios, no key escrow problem, stronger security, lightweight computation and low communication overheads for mobile devices, which impede their widespread application. To achieve the above functions, we present a lightweight certificateless multi-user matchmaking encryption (LC-MUME) for mobile devices, which enhances security flexibly and performance based on standard hard assumptions and low-consumption pairing-free technology, while also avoiding one-by-one encryption for each user. The proposed LC-MUME scheme enjoys minor computation and communication overheads in a one-to-many non-interactive certificateless cryptosystem. We prove that our scheme achieves indistinguishability-based chosen-ciphertext attack (IND-CCA) security, the existential unforgeability under a chosen message attack (EU-CMA) security and anonymity-CCA security under the random oracle model. Our LC-MUME scheme outperforms the state-of-the-art schemes regarding efficiency and flexibility, as demonstrated by the performance comparison and analysis, and therefore is a practical solution for resource-constrained mobile devices.将上述内容去除空格与符号后转换为随机字母
最新发布
03-18
<think>嗯,用户想处理一段关于轻量级多用户匹配加密技术的文字,去除空格和标点,然后生成随机字母。首先,我需要理解他们的需求。可能他们需要清理文本数据,用于某种加密或测试场景。 根据引用[1],文本清洗的第一步是去除噪声,比如空格、标点。那用户的要求正好是这部分,所以需要用到正则表达式来替换这些不需要的字符。比如用re.sub来替换掉空格和标点符号。标点可能包括常见的比如逗号、句号、感叹号等等,可以用[\W_]来匹配非字母数字字符和下划线,然后替换成空字符串。 接下来,生成随机字母。用户提到要转换为随机字母,可能是指将处理后的文本中的每个字符替换为随机字母,或者根据处理后的文本生成全新的随机字母序列?需要确认一下。但根据问题描述,应该是去除原有字符中的空格和标点后,将剩下的字符转换成随机字母。或者可能是将清理后的文本中的每个字符都替换成随机字母?比如原文处理后是“abc”,变成随机字母如“xzv”? 假设用户是想将处理后的文本中的每个字符替换为随机字母。那可能需要遍历每个字符,然后随机替换。或者,用户可能希望生成一个与原文本长度相同但由随机字母组成的字符串,不管原内容是什么。比如清理后的文本长度为N,生成N个随机字母。 需要进一步分析用户的问题。原问题中的“转换为随机字母”可能是指后者,即生成与原文本清理后长度相同的随机字母序列,而不是替换原有字符。例如,原文本处理后是“abc123”,清理后变成“abc”,然后生成三个随机字母如“xyz”。 或者,可能用户希望将清理后的文本中的每个字符(比如汉字或数字)转换为随机字母。例如,原文本是“加密技术”,清理后变成“加密技术”,然后每个汉字被替换为随机字母。但汉字转换比较复杂,可能需要先得到字符串的长度,然后生成对应长度的随机字母。 根据用户提供的例子,比如引用[2]中提到的生成模拟姓名和住址,可能用户需要的是生成随机字母,而不是保留原有文字。所以可能步骤是:清理原文本中的空格和标点,得到一个字符串,然后将该字符串中的每个字符(可能包括汉字、字母等)替换成随机字母,或者根据清理后的字符串长度生成一个全新的随机字母序列。 但通常来说,生成随机字母可能不需要依赖原文本的内容,只需要长度。但用户的问题是将处理后的文本转换为随机字母,所以可能需要保持相同的长度,但每个字符被随机字母替换。 因此,处理步骤可能如下: 1. 使用正则表达式去除所有空格和标点符号,得到清理后的字符串。 2. 将清理后的字符串中的每个字符替换为随机选择的字母(大写或小写?需要确认)。 或者,生成一个与清理后字符串长度相同的随机字母序列,不管原来的字符是什么。 比如,原文本处理后长度为5,生成5个随机字母。这可能更符合用户的需求,特别是如果原文本处理后可能包含非字母字符(如中文),但用户希望得到的是纯随机字母。 在这种情况下,步骤应该是: 1. 清理原文本,去除空格和标点,得到一个字符串(可能包含中文、数字、字母等)。 2. 计算该字符串的长度N。 3. 生成一个长度为N的随机字母字符串,由大小写字母组成。 或者,如果用户希望将清理后的文本中的非字母字符去除,仅保留字母,然后随机替换这些字母?但原问题中的需求是去除空格和符号后转换为随机字母,可能不需要保留原有字母,而是全部替换。 所以,正确的步骤可能是: 清理原文本中的空格和标点,得到字符串S。然后生成一个长度等于S的随机字母字符串。 例如,如果S是“加密技术”(长度4),则生成四个随机字母,如“XkDz”。 那如何实现呢? 首先,使用正则表达式去除所有空格和标点。可以使用re.sub,替换模式为[\s\W_]+,替换为空字符串,这样就移除了所有空白字符(空格、换行等)和非单词字符(标点等)。 然后,获取处理后字符串的长度,生成对应长度的随机字母。可以使用random.choices从string.ascii_letters中随机选取字符,然后拼接成字符串。 但需要注意的是,如果原文本处理后可能为空,需要处理这种情况,比如返回空字符串或提示用户。 现在,考虑代码实现: 导入必要的库:re和random。 定义函数,接受原始文本,进行处理: def text_to_random_letters(text): # 去除空格和标点符号 cleaned_text = re.sub(r'[\s\W_]+', '', text) # 生成随机字母 length = len(cleaned_text) if length == 0: return "" random_letters = ''.join(random.choices(string.ascii_letters, k=length)) return random_letters 然后测试一下,比如输入为“轻量级多用户匹配加密技术!@#”,处理后的cleaned_text应该是“轻量级多用户匹配加密技术”(假设中文未被\W匹配),这时候长度是N,然后生成N个随机字母。 但这里有个问题:正则表达式中的\W匹配非单词字符,而单词字符包括字母、数字和下划线。所以,对于中文来说,中文字符属于\W吗?在Python的re模块中,\W等同于[^a-zA-Z0-9_],所以中文会被\W匹配到。因此,使用re.sub(r'[\s\W_]+', '', text)会将所有非字母数字下划线的字符以及空格和下划线都去掉。但原问题中的用户可能希望保留中文吗?或者用户是想去除所有非字母字符? 这可能是个问题。例如,如果原文本包含中文,如“加密技术”,那么经过re.sub(r'[\s\W_]+', '', text)后,这些中文字符会被删除吗? 是的,因为中文字符属于\W,所以会被替换为空。这时候cleaned_text可能变成空字符串,导致无法生成随机字母。这显然不符合用户的需求,因为用户可能希望处理后的字符串是去除空格和标点后的内容,然后转换为随机字母,而原内容可能包含中文或其他字符,但用户希望将这些字符去除,只剩下字母数字?或者用户可能希望将中文也视为有效字符,保留下来,但转换为随机字母? 这时候需要明确用户的需求。根据问题描述,用户想将文本“去除空格与符号后转换为随机字母”。可能用户的原文本包含字母、数字、中文等,但处理后的字符串需要去除空格和标点符号,然后将剩下的字符(可能包括中文、字母、数字)转换为随机字母。但中文如何处理?或者用户可能希望处理后的字符串仅包含字母和数字,但根据用户提供的引用[2],他们之前处理过去除数字,所以可能这里需要保留字母,去除其他字符。 或者用户的需求是将所有非字母的字符(包括中文、数字、标点)都去除,然后生成随机字母。这可能更合理。 因此,可能需要调整正则表达式,仅保留字母,然后生成相同长度的随机字母。例如: cleaned_text = re.sub(r'[^A-Za-z]+', '', text) 这样,所有非字母的字符都会被去除,剩下的只是字母。然后根据该长度生成随机字母。或者,如果用户希望处理后的字符串是去除空格和标点后的长度,不管原来的内容是什么,那可能需要先去除空格和标点,得到长度,再生成随机字母。 但用户的问题中,可能原文本可能包含中文,例如关于加密技术的描述可能有中文,所以需要先处理中文部分。这时候,原来的正则表达式可能无法正确保留中文,导致长度变为0,从而无法生成随机字母。 这时候可能需要调整正则表达式,仅去除空格和标点符号,而保留其他字符(包括中文),然后生成与原长度相同的随机字母。例如: 用户希望不管原来的内容是什么,去除空格和标点后的字符串长度作为随机字母的长度。例如,原文本处理后长度为10,则生成10个随机字母。 这时候,正确的处理步骤是: 1. 去除所有空格和标点符号,得到长度为N的字符串(可能包含中文、字母、数字等)。 2. 生成N个随机字母,不管原来的内容是什么。 这时候的代码应该如下: 使用正则表达式去除空格和标点符号: 标点符号在正则表达式中可以用[\s!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~],或者用string.punctuation来获取。但可能更简单的方式是使用[\s\W_],但需要注意中文是否会被包含进去。 或者,使用更精确的正则表达式来匹配空格和标点,例如: pattern = r'[\s!"#$%&\'()*+,-./:;<=>?@\[\\\]^_`{|}~]+' 这样,标点符号被明确匹配,而中文字符不会被匹配,因此会被保留。但用户可能希望将中文也去除?这需要明确。 但根据用户的问题,他们想将文本去除空格和标点后转换为随机字母。可能用户希望处理后的文本只包含字母,所以需要去除所有非字母的字符,包括中文、数字、标点等,然后生成与原处理后的文本相同长度的随机字母。或者,处理后的文本可能包含字母和数字,但用户需要生成随机字母,所以可能需要进一步处理。 或者,用户可能希望不管处理后的文本是什么内容,只要长度,然后生成对应长度的随机字母。例如,原文本处理后可能有10个字符(包括中文或其他),用户需要生成10个随机字母。 这种情况下,需要正确计算处理后的字符串长度,不管里面的内容是什么。 因此,正确的步骤是: 1. 去除所有空格和标点符号,得到字符串S。 2. 计算S的长度N。 3. 生成N个随机字母。 此时,关键是如何正确去除空格和标点符号,而保留其他字符(如中文、字母、数字等)。但根据用户提供的示例中的代码,在引用[1]中使用的是: text = re.sub('[\W_]+', ' ', text) 其中\W匹配非单词字符,即除了字母、数字、下划线之外的字符。所以,如果原文本包含中文,会被\W匹配到,替换为空格。但用户的需求是去除空格和标点,所以可能正确的正则表达式应该是匹配空格和标点符号,并将它们替换为空。 所以,正确的正则表达式可能是: cleaned_text = re.sub(r'[\s\p{P}]+', '', text, flags=re.UNICODE) 但Python的re模块不支持\p{P}属性,需要使用regex库。或者,使用更通用的方式,比如匹配标点符号和空格。 或者,使用string.punctuation来获取所有标点符号,然后构建正则表达式。例如: import string punctuation = string.punctuation pattern = r'[\s{}]+'.format(re.escape(punctuation)) 然后,将匹配所有空格和标点符号,替换为空。但这种方法可能无法覆盖所有Unicode标点符号,比如中文的标点如“,”“。”等。所以可能需要更全面的处理方式。 用户的问题可能主要针对英文标点,或者希望去除所有类型的标点符号,包括中文标点。例如,中文标点如“,”属于\W吗?在Python的re中,是的。所以,如果使用正则表达式r'[\s\W_]+',会匹配空格、所有非单词字符(包括中文标点和汉字),以及下划线。替换为空的话,会导致汉字也被删除。这可能不符合用户需求,因为用户可能希望保留处理后的字符串中的汉字,只是去除空格和标点。 这时候,用户可能需要分开处理:仅去除空格和标点符号,但保留其他字符(如汉字、字母、数字等)。 这时候,正确的正则表达式应该是匹配空格和标点符号,而不是其他字符。例如: 标点符号的正则表达式可以写成[\u4e00-\u9fff]以外的标点,但可能比较复杂。或者使用Unicode属性,但Python的re不支持。因此,可能需要手动列举常见的标点符号,包括中文标点。 另一种思路是,匹配所有Unicode标点符号。根据正则表达式,可以使用\p{P},但需要启用UNICODE标志,并使用regex模块。或者,手动列举。 这可能比较复杂,所以可能更简单的方式是,先去除空格,然后去除标点符号。例如,先替换掉所有空格,再替换标点符号。 例如: cleaned_text = re.sub(r'\s+', '', text) # 去除所有空格 cleaned_text = re.sub(r'[^\w\s]', '', cleaned_text) # 去除标点符号? 但可能这还不够。或者,使用以下正则表达式: cleaned_text = re.sub(r'[!"#$%&\'()*+,-./:;<=>?@\[\\\]^_`{|}~“”‘’,。?、!¥…()—]+', '', text) cleaned_text = re.sub(r'\s+', '', cleaned_text) 这样,手动添加中文标点到正则表达式中。例如,““””、“””、“‘’”、“,”、“。”、“?”、“、”、“!”、“¥”、“…”、“()”、“—”等。 这可能更准确,但需要用户明确标点符号的范围。或者,用户可能只需要处理基本的英文标点,而中文标点可能不在考虑范围内。但根据用户的问题,可能处理中文标点也是需要的。 综上,为了简化问题,假设用户希望去除所有空格和标点符号(包括中文标点),然后生成与原处理后的字符串长度相同的随机字母。这时候,处理后的字符串可能包含汉字、字母、数字等,但用户希望生成随机字母,所以不需要保留原内容,只需要长度。 因此,正确的代码逻辑应该是: 1. 使用正则表达式去除所有空格和标点符号(包括中文标点),得到字符串S。 2. 计算S的长度N。 3. 生成N个随机字母组成的字符串。 例如,原文本是“你好,世界!”,处理后S的长度是4(“你好世界”),生成四个随机字母。 为了实现这一点,需要正确去除所有空格和标点符号。这里可以使用Unicode属性,但Python的re模块不支持。因此,可能需要使用更通用的方式,例如: pattern = r'[\s!"#$%&\'()*+,-./:;<=>?@\[\\\]^_`{|}~“”‘’「」【】,。?、!¥…()—]+' 然后,替换为空: cleaned_text = re.sub(pattern, '', text) 但这样可能会遗漏某些标点符号。或者,使用更广泛的标点符号集合,或者分两次处理:首先去空格,然后去标点符号。 另一种方法是,使用Unicode范围来匹配中文标点。例如,中文标点符号的范围大致在\u3000-\u303F、\uFF00-\uFFEF等。但需要具体查找正确的Unicode块。 例如,中文标点符号如“,”、“。”位于\u3000-\u303F范围内。可以使用正则表达式: pattern = r'[\s\u3000-\u303F\uff00-\uffef!"#$%&\'()*+,-./:;<=>?@\[\\\]^_`{|}~]+' 但这样可能过于复杂。对于用户的问题,可能更简单的方式是接受可能无法完全去除所有标点符号,但提供一个示例性的正则表达式,并建议用户根据需要调整。 所以,在代码中,可以使用: import re import random import string def text_to_random_letters(text): # 去除所有空格和标点符号(包括中文标点示例) cleaned_text = re.sub(r'[\s\W_]+', '', text, flags=re.UNICODE) # 生成等长随机字母 length = len(cleaned_text) if length == 0: return "" return ''.join(random.choices(string.ascii_letters, k=length)) 但测试发现,使用re.sub(r'[\s\W_]+', '', text, flags=re.UNICODE)的话,对于包含中文的文本,如“你好,世界!”,\W会匹配中文字符,导致cleaned_text为空字符串。因此,这可能不符合用户需求,因为用户可能希望保留中文,只是去除空格和标点。 这时候,需要调整正则表达式,仅匹配空格和标点符号,而不是所有非单词字符。因此,正确的正则表达式应该仅匹配空格和标点,保留其他字符(包括中文、字母、数字等)。 因此,正确的方法应该是: pattern = r'[\s!"#$%&\'()*+,-./:;<=>?@\[\\\]^_`{|}~“”‘’,。?、!¥…()—]+' cleaned_text = re.sub(pattern, '', text) 但手动添加所有可能的标点符号可能很繁琐。另一种方法是使用string.punctuation来获取英文标点,然后手动添加中文标点: import string punctuation = string.punctuation + '“”‘’「」【】,。?、!¥…()—' pattern = r'[\s{}]+'.format(re.escape(punctuation)) cleaned_text = re.sub(pattern, '', text) 这样,可以匹配所有英文和中文标点符号以及空格。 因此,代码应该调整为: def text_to_random_letters(text): # 定义包含中英文标点的正则表达式模式 punctuation = string.punctuation + '“”‘’「」【】,。?、!¥…()—' pattern = r'[\s{}]+'.format(re.escape(punctuation)) # 去除空格和标点符号 cleaned_text = re.sub(pattern, '', text) # 生成等长随机字母 length = len(cleaned_text) if length == 0: return "" return ''.join(random.choices(string.ascii_letters, k=length)) 这样处理后,例如输入文本为“轻量级多用户匹配加密技术!@#”,处理后的cleaned_text为“轻量级多用户匹配加密技术”,长度为12,生成12个随机字母。 但需要注意的是,原文本中的汉字在cleaned_text中仍然存在,但用户需要的是生成随机字母,与原内容无关,只需要长度。所以此时,生成的随机字母的长度等于原文本去除空格和标点后的字符数(包括汉字、字母、数字等),但原内容中的汉字、字母等都会被保留,导致长度可能较长,而用户可能希望生成与原文本处理后相同长度的随机字母,不管原来的内容是什么字符。 这种情况下,代码是正确的,因为生成的长度等于处理后的文本长度,不管原内容中的字符类型。 测试示例: 输入文本:"这是一个测试,包含空格 和标点!@#" 处理后,cleaned_text = "这是一个测试包含空格和标点" (假设标点包括中文逗号和感叹号,所以被替换为空) 长度为15个字符(每个汉字算一个字符),生成15个随机字母。 所以,该函数能正确生成所需长度的随机字母字符串。 综上,最终的解决方案是: 使用正则表达式去除所有空格和标点符号(包括中英文标点),然后根据处理后的字符串长度生成随机字母序列。需要注意标点符号的正则表达式需要尽可能全面,覆盖用户可能用到的所有标点。同时,处理后的字符串可能包含中文、字母、数字等,但生成的是与原长度相同的随机字母。 最后,用户可能需要将生成的随机字母用于加密或其他需要随机字符串的场景,所以代码需要确保生成的是大小写混合的字母,或者根据需求调整。例如,可以参数化是否使用大写或小写,但根据当前问题,直接使用string.ascii_letters(包含大小写)即可。</think>### 文本处理与随机字母生成方法 #### 步骤说明 1. **去除空格和标点符号** 使用正则表达式匹配所有空格和标点符号(包括中英文标点),将其替换为空字符串。 ```python import re text = "示例文本:轻量级多用户匹配加密技术!@#" cleaned_text = re.sub(r'[\s!"#$%&\'()*+,-./:;<=>?@\[\\\]^_`{|}~“”‘’,。?、!¥…()—]+', '', text) ``` 2. **生成随机字母** 根据清洗后文本的长度,生成等长的随机字母组合(包含大小写)。 ```python import random import string def generate_random_letters(cleaned_text): length = len(cleaned_text) if length == 0: return "" return ''.join(random.choices(string.ascii_letters, k=length)) ``` #### 完整代码示例 ```python import re import random import string def text_to_random_letters(text): # 定义包含中英文标点的正则表达式 punctuation = r'\s!"#$%&\'()*+,-./:;<=>?@\[\\\]^_`{|}~“”‘’,。?、!¥…()—' cleaned_text = re.sub(f'[{punctuation}]+', '', text) # 生成等长随机字母 length = len(cleaned_text) if length == 0: return "" return ''.join(random.choices(string.ascii_letters, k=length)) # 示例用法 original_text = "轻量级多用户匹配加密技术(方案)!@#2023" result = text_to_random_letters(original_text) print("随机字母序列:", result) ``` #### 代码解释 - **正则表达式清洗**:`re.sub(f'[{punctuation}]+', '', text)` 会移除所有空格和中英文标点符号[^1]。 - **随机字母生成**:`random.choices(string.ascii_letters, k=length)` 从大小写字母中随机选取字符,生成与清洗后文本长度相同的序列[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值