忽略Python字符串中的大小写
忽略大小写,比较Python中字符串的最简单方法是什么?
当然可以做到(str1.lower()<= str2.lower())等,但这会创建两个附加的临时字符串(明显的alloc / gc开销)。
我想我正在寻找一个等效于C的stricmp()。
[请求更多上下文,所以我将用一个简单的示例进行演示:]
假设您要排序一个完整的字符串列表。您只需执行List.sort()。这是O(n * log(n))字符串比较,没有内存管理(因为所有字符串和列表元素都是某种智能指针)。你很快乐。
现在,您想做同样的事情,但是忽略大小写(让我们简化并说所有字符串都是ascii,因此可以忽略语言环境问题)。您可以执行List.sort(key =
lambda
s:s.lower()),但随后每次比较会导致两个新分配,并给重复的(降低的)字符串增加垃圾收集器的负担。每个这样的内存管理噪声都比简单的字符串比较慢几个数量级。
现在,使用类似stricmp()的函数进行操作:theList.sort(cmp =
stricmp),它与List.sort()一样快且对内存友好。你又开心了
问题是任何基于Python的不区分大小写的比较都涉及隐式字符串重复,因此我期望找到基于C的比较(也许在模块字符串中)。
找不到类似的内容,因此这里出现了问题。(希望这可以澄清问题)。
-
回应您的澄清…
您可以使用ctypes执行c函数“
strcasecmp”。Ctypes包含在Python
2.5中。它提供了调出dll和共享库(如libc)的功能。这是一个简单的示例(Linux上的Python;有关Win32帮助的链接,请参见):from ctypes import * libc = CDLL("libc.so.6") // see link above for Win32 help libc.strcasecmp("THIS", "this") // returns 0 libc.strcasecmp("THIS", "THAT") // returns 8
可能还想参考strcasecmp文档
不能确定这是更快还是更慢(尚未测试),但这是使用C函数进行不区分大小写的字符串比较的一种方法。
~~~~~~ActiveState代码-食谱194371:不
区分大小写的字符串是用于创建不区分大小写的字符串类的食谱。快速执行某些操作可能会导致终止,但是如果您打算经常使用它们,可以为您提供一种处理不区分大小写的字符串的通用方法。