首页 / 知识
忽略Python字符串中的大小写
2023-04-15 08:12:00

Ignore case in Python strings本问题已经有最佳答案,请猛点这里访问。
忽略大小写,比较Python中字符串的最简单方法是什么? 当然可以做到(str1.lower()<= str2.lower())等,但这会创建两个额外的临时字符串(明显的alloc / g-c开销)。 我想我正在寻找一个等效于C的stricmp()。 [需要更多上下文,所以我将用一个简单的示例进行演示:]
假设您要排序一个完整的字符串列表。您只需执行List.sort()。
现在,您想做同样的事情,但是忽略这种情况(让我们简化并说
现在,使用类似于stricmp()的函数,您可以执行:theList.sort(cmp = stricmp)
问题是任何基于Python的不区分大小写的比较都涉及隐式字符串
找不到类似的内容,因此这里出现了问题。
这是一个基准测试,显示使用
我机器上的典型时间:
因此,带有
注意: 您的问题暗示您不需要Unicode。试试下面的代码片段;如果它对您有用,那么您已经完成:
说明:如果乍一看不太明显,则locale.strcoll似乎是您需要的功能,避免使用str.lower或locale.strxfrm"重复"字符串。 您是否在对性能敏感的应用程序经常执行的路径中使用此比较?或者,您是否在大小为兆字节的字符串上运行此代码?如果不是,那么您不必担心性能,而只需使用.lower()方法。 下面的代码演示了如何通过在两个1.8GHz台式机上调用.lower()两个字符串来进行大小写不敏感的比较,这两个字符串的大小几乎都是兆字节,大约需要0.009秒:
如果确实这是代码中极其重要的,对性能至关重要的部分,则建议您使用C编写一个函数并从您的Python代码中调用它,因为这将使您能够进行真正有效的不区分大小写的搜索。可以在这里找到有关编写C扩展模块的详细信息:https://docs.python.org/extending/extending.html 我找不到任何其他不区分大小写的内置方法:python Cookbook食谱使用lower()。 但是,由于土耳其语I问题,在使用更低的进行比较时必须小心。不幸的是,Python对于"土耳其语"的处理不好。 ?被转换为I,但我未转换为?。 ?被转换为i,但我未被转换为?。 没有与您想要的功能等效的内置功能。 您可以编写自己的函数,一次将每个字符转换为.lower(),以避免重复两个字符串,但是我确信它会占用大量CPU并且效率极低。 除非您使用极长的字符串(如果重复使用太长的字符串,可能会导致内存问题),否则我将使其简单易用
你会没事的 这个问题问的是两个截然不同的问题:
由于已经很好地回答了#1(即:str1.lower()
仅在有意义的情况下才使用此功能,因为在许多情况下,小写技术将是更好的选择。
我只使用ascii字符串,我不确定unicode会如何表现。
如果标准库中对某些内容的支持不佳,我总是会寻找PyPI软件包。随着虚拟化和现代Linux发行版的普及,我不再避免使用Python扩展。 PyICU似乎符合要求:https://stackoverflow.com/a/1098160/3461 现在还有一个纯python选项。经过充分测试的:https://github.com/jtauber/pyuca 旧答案: 我喜欢正则表达式解决方案。这是一个可以复制和粘贴到任何函数中的函数,这要归功于python对块结构的支持。
由于我使用匹配而不是搜索,因此无需在正则表达式中添加插入符号(^)。 注意:这仅检查相等性,有时这是必需的。我也不会说我喜欢它。 这是您如何使用re进行操作:
建议使用昂贵的计算键对值列表进行排序的惯用法是所谓的"装饰模式"。它仅包括从原始列表中构建(键,值)元组的列表,然后对该列表进行排序。然后,消除键并获得排序值列表很简单:
或者,如果您喜欢单线:
如果您真的担心调用lower()的开销,则只需在任何地方存储(低位字符串,原始字符串)元组。元组是Python中最便宜的一种容器,它们也是可哈希的,因此可以用作字典键,集合成员等。 对于偶尔甚至重复的比较,只要在核心代码的最内层循环中不会发生或者您没有足够的数据实际注意到性能影响,几个额外的字符串对象就无关紧要。看看你是否这样做:以"愚蠢"的方式做事要愚蠢得多,如果你做的也更少。 如果您真的想不区分大小写地比较很多文本,则可以以某种方式保留字符串的小写形式,以避免最终确定和重新创建,或者将整个数据集标准化为小写形式。当然,这取决于数据集的大小。如果针头相对较少且干草堆较大,则用已编译的正则表达式对象替换针头是一种解决方案。如果不看具体例子就很难说。 我很确定您必须使用.lower()或使用正则表达式。我不知道内置的不区分大小写的字符串比较功能。 您可以只在需要时才将每个字符串一次转换为小写字母,或者仅在需要时才将其转换为小写字母;如果知道要对整个字符串集合进行排序,则可以将其转换为小写。有几种方法可以将此比较键附加到要排序的实际数据上,但是这些技术应在单独的问题中解决。 请注意,此技术不仅可以用于处理大小写问题,还可以用于其他类型的排序,例如特定于语言环境的排序,或"库样式"标题排序,而忽略标题,并在排序之前对数据进行规范化。
只需使用 "如何编写Python扩展"似乎是不错的介绍。 更有趣的是,本指南将使用ctypes库与编写外部C模块进行了比较(ctype比C扩展慢得多)。
您可以将 回应您的澄清... 您可以使用ctypes执行c函数" strcasecmp"。 Ctypes包含在Python 2.5中。它提供了调出dll和共享库(如libc)的功能。这是一个简单的示例(Linux上的Python;有关Win32帮助的链接,请参见):
可能还想参考strcasecmp文档 并不是很确定这是更快还是更慢(尚未测试),但这是使用C函数进行不区分大小写的字符串比较的一种方法。 ~~~~~~~~~~~~~~
ActiveState代码-食谱194371:不区分大小写的字符串 |
最新内容
相关内容
linux命令替换字符串?
linux命令替换字符串?,字符串,文件,批量,首次,数据,命令,内容,方法,用字,结尾,linux下批量查询文件内容字符串并替换一)通过vi编辑器来替换。vilinux中分命令大小写?
linux中分命令大小写?,系统,工作,地址,大小写,命令,目录,管理,名称,信息,文件名,Linux命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出linux拼接字符串命令?
linux拼接字符串命令?,系统,工作,代码,工具,名称,信息,地址,时间,数据,命令,linux中用shell时奇怪的字符串拼接和时间计算问题如果想要在变量linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你添加字符串命令linux?
添加字符串命令linux?,情况,名称,文件,位置,名字,地方,连续,信息,命令,内容,Linux下怎么输入连字符?末尾加个\这个符号就能两行。部分命令也linuxls命令排序?
linuxls命令排序?,工作,系统,信息,数据,命令,目录,标准,基础,管理,时间,Linux列出当前目录下的文件和目录用什么命令在Linux系统中,使用ls命令linux排序数字命令?
linux排序数字命令?,标准,数字,单位,情况,系统,信息,命令,文件,顺序,参数,linux下用shell编写,键盘输入三个数,按大小排序输出1、这个问题可以linuxll排序命令?
linuxll排序命令?,系统,信息,地址,标准,工作,命令,时间,数据,文件,目录,Linux列出当前目录下的文件和目录用什么命令1、linux系统下用ls命令列linux命令查找字符串?
linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文本,Linux中使用grep命令,查询多个字符串Linux grep命令用于查找文linux命令按大小排序?
linux命令按大小排序?,数字,地址,时间,工作,标准,系统,命令,信息,单位,软件,linuxsort命令列表从大到小排序完如何保存Linux sort命令参数:-b:忽linux计数排序命令?
linux计数排序命令?,标准,命令,情况,工作,文件,系统,数字,管理,目录,内容,Linux文本处理命令的Sort命令sort命令的语法格式:sort[参数][文件]Lilinux命令查看上下文?
linux命令查看上下文?,地址,信息,工作,数据,密码,系统,标准,命令,文件,名称,linux常用命令1、linux常用命令:查看内核版本:uname-a。图形界面:ini