Python 优雅编程:会报恩的代码(五)

2024-09-07 04:28

本文主要是介绍Python 优雅编程:会报恩的代码(五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 引言
    • 从文本搜索指定单词,不区分单词的大小写
      • 使用 `str.lower()`
      • 使用 `re` 模块
    • 从文本搜索多个单词,依旧不区分单词的大小写
      • 使用 `str.lower()` 和循环
      • 使用 `re` 模块
    • 反复执行 re.compile,re 是否会缓存编译结果?
    • 结语

引言

在 Python 编程中,有一些常用技巧和最佳实践可以帮助你编写更优雅、更高效的代码。本文将介绍的是使用 Python 从文本中搜索指定单词的几个简单实现方式。

在这里插入图片描述

从文本搜索指定单词,不区分单词的大小写

我们可以使用 Python 的内置字符串方法以及正则表达式来搜索文本中的指定单词,且不区分大小写。

使用 str.lower()

如果希望使用简单的字符串方法,可以将文本和目标单词都转换为小写,然后进行比较:

def search_word(text, word):# 转换为小写text_lower = text.lower()word_lower = word.lower()# 检查单词是否在文本中if word_lower in text_lower:return Truereturn False# 示例
text = "Hello, this is a sample Text."
word = "text"
found = search_word(text, word)
print(found)  # 输出: True

使用 re 模块

如果想使用正则表达式,可以用 re 模块的 re.IGNORECASE 选项:

import redef search_word(text, word):# 使用正则表达式不区分大小写pattern = re.compile(re.escape(word), re.IGNORECASE)return bool(pattern.search(text))# 示例
text = "Hello, this is a sample Text."
word = "text"
found = search_word(text, word)
print(found)  # 输出: True

这两种方法都可以有效地搜索文本中的指定单词,且不区分大小写。选择适合需求的方法即可。

从文本搜索多个单词,依旧不区分单词的大小写

如果希望在文本中搜索多个单词,可以扩展前面的示例。

使用 str.lower() 和循环

可以将多个单词转换为小写并逐个检查:

def search_words(text, words):# 转换为小写text_lower = text.lower()words_lower = [word.lower() for word in words]# 检查每个单词是否在文本中found_words = [word for word in words_lower if word in text_lower]return found_words# 示例
text = "Hello, this is a sample Text."
words = ["text", "hello", "sample", "world"]
found = search_words(text, words)
print(found)  # 输出: ['text', 'hello', 'sample']

使用 re 模块

使用正则表达式可以创建一个模式,匹配多个单词:

import redef search_words(text, words):# 创建正则表达式模式pattern = re.compile(r'\b(?:' + '|'.join(map(re.escape, words)) + r')\b', re.IGNORECASE)# 搜索所有匹配的单词return pattern.findall(text)# 示例
text = "Hello, this is a sample Text."
words = ["text", "hello", "sample", "world"]
found = search_words(text, words)
print(found)  # 输出: ['Hello', 'Text', 'sample']

其中的正则表达式的作用是将多个单词组合成一个正则模式。确保这些单词作为独立的整词出现(通过使用单词边界)。在搜索时不区分大小写。

例如,如果 words 列表包含 ["cat", "dog"],则编译后的 pattern 表达式将类似于:

r'\b(?:cat|dog)\b'

这样,这个模式就可以匹配文本中的“cat”或“dog”,并且这些单词必须是独立的,不是其他词的一部分。

这段正则表达式用于编译一个模式,以匹配多个指定单词。表达式每个部分的详细解释如下。

r'\b(?:...)\b'

  • r'...': 这是一个原始字符串(raw string),它告诉 Python 不要对字符串中的反斜杠进行转义处理。这在> 编写正则表达式时非常有用,因为正则中的很多模式都包含反斜杠。

  • \b: 这是一个单词边界(word boundary)匹配符。它匹配单词的开始或结束位置,确保匹配的单词是完整的,> 而不是长词的一部分。例如,在匹配“cat”时,\bcat\b只会匹配“cat”这个词,而不会匹配“category”中的“cat”。

  • (?:...): 这是一个非捕获分组(non-capturing group)。它的作用是将多个元素组合在一起,但不创建一个> 捕获组。这样可以在正则表达式中将多个选项组合在一起,而不会增加额外的捕获组。

|(或操作符)

  • '|'.join(map(re.escape, words)): 这段代码会将 words 列表中的所有单词通过 |(或操作符)连接> 成一个长字符串。map(re.escape, words) 用于处理 words 列表中每个单词,确保特殊字符不会影响正则表达式> 的匹配。例如,如果单词中有点号、星号等特殊字符,re.escape 会在这些字符前添加反斜杠,使其被视为字面字符。

re.IGNORECASE

  • 这是一个标志,表示匹配时不区分大小写。当这个标志被设置,正则表达式的匹配会忽略字母的大小写。

以上两种方法都可以有效地搜索文本中的多个指定单词。可以根据需求选择适合的方法。第一种方法直接使用字符串方法,第二种方法则利用正则表达式提供了更强大的功能。

反复执行 re.compile,re 是否会缓存编译结果?

Python 的 re 模块是会缓存编译的正则表达式的。这个缓存机制可以有效提高性能,避免对同一模式的重复编译。

缓存机制

当使用 re.compile() 编译一个正则表达式时,Python 会创建一个正则表达式对象,并在内部进行一些优化。

re 模块会在内部缓存最近使用的正则表达式。具体来说,Python 会保留最后 1000 个不同的模式,以供后续的重复使用。如果在同一程序运行中多次使用 re.compile() 编译相同的模式,Python 会直接返回缓存中的已经编译的对象而不是重复编译。

性能提升

缓存机制的作用明显,正则表达式的编译是一个相对昂贵的操作。通过避免重复编译,可以显著提高代码的运行效率。

最佳实践

如果在多个不同的字典或列表中使用相同的正则表达式模式,并在此过程中调用 re.compile(),那么如果模式相同,Python 会利用缓存。但是,为了保证最佳性能,尤其在频繁使用的情况下,建议将相同的正则表达式编译一次并存储在变量中,而不是每次都调用 re.compile()

验证示例

# 多次使用相同的正则表达式
pattern1 = re.compile(r'\bcat\b', re.IGNORECASE)
pattern2 = re.compile(r'\bcat\b', re.IGNORECASE)# pattern1 和 pattern2 是相同的模式
print(pattern1 is pattern2)  # 输出可能为 False,但模式是相同的
# True

在处理不同单词集合时,建议在循环外部编译正则模式,确保良好的性能并充分利用缓存特性。

结语

本文介绍了使用 Python 从文本中搜索指定单词的几个特定用法,并验证了 re.compile 中缓存的存在,希望这些小技巧能在某个特定的时间正好帮到你。


PS:感谢每一位志同道合者的阅读,欢迎关注、点赞、评论!


  • 上一篇:Python 优雅编程:会报恩的代码(四)
  • 专栏:「计算通践」

这篇关于Python 优雅编程:会报恩的代码(五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144051

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d