字符串忽略大小写写比较字符串大小

中国领先的IT技术网站
51CTO旗下网站
不区分大小写对字符串列表排序
《Python Cookbook(第2版)中文版》第4章引言由David Ascher撰写,本章包括了一些很通用的,可以应用到各处的技术,这些内容难于归结到某个类别。本节为大家介绍用一条语句完成赋值和测试。
作者:高铁军译来源:人民邮电出版社| 22:50
5.2& 不区分大小写对字符串列表排序
感谢:Kevin Altis、Robin Thomas、Guido van Rossum、Martin V. Lewis、Dave Cross
你想对一个字符串列表排序,并忽略掉大小写信息。举个例子,你想要小写的a排在大写的B前面。默认的情况下,字符串比较是大小写敏感的(比如所有的大写字符排在小写字符之前)。
采用decorate-sort-undecorate(DSU)用法既快又简单:def&case_insensitive_sort(string_list): &&&&&&auxiliary_list&=&[(x.lower(&),&x)&for&x&in&string_list]&&&&#&decorate &&&&&&auxiliary_list.sort(&)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&#&sort &&&&&&return&[x[1]&for&x&in&auxiliary_list]&&&&&&&&&&&&&&&&&&&&&&&&&&#&undecorate&
Python 2.4已经提供对DSU的原生支持了,因此(假设string_list的元素都是真正的普通字符串,而不是Unicode对象之类),可以用更简短更快的方式:def&case_insensitive_sort(string_list): &&&&&&return&sorted(string_list,&key=str.lower)&
一个很明显的可选方案是编写一个比较函数,并将其传递给sort方法:def&case_insensitive_sort_1(string_list): &&&&&&&def&compare(a,&b):&return&cmp(a.lower(&),&b.lower(&)) &&&&&&&string_list.sort(compare)&
不过,在每次比较中,lower方法都会被调用两次,而对于长度为n的列表来说,比较的次数与nlog(n)成正比。
DSU方法则创建了一个辅助的列表,每个元素都是元组,元组的元素则来自原列表并被当做"键"处理。这个排序是基于键的,因为Python的元组的比较是根据条目顺序进行的(比如,它会首先比较元组的第一个元素)。要将一个长度为n的字符串列表排序,配合DSU的使用,lower方法只需要被调用n次,因而在第一步,decorate阶段,以及最后一步,undecorate阶段节省了很多时间。
DSU有时也被称为-但这种叫法不是很准确-Schwartzian变换,这是对Perl的一个著名应用的一个不太准确的类比。(如果要说相似,DSU更接近于Guttman-Rosler变换,见。)
DSU是如此重要,因此Python 2.4提供了对它的直接支持。可以给列表的sort方法传递一个可选的命名参数key,而且它可以被调用,作用于列表中的每个元素并获得用于排序的键。如果传递这样的一个参数,排序会在内部使用DSU。因此,在Python 2.4中,string_list.sort(key = str.lower实际上等价于case_insensitive_sort函数,只不过sort方法会直接作用于原列表(且返回None),而不是返回一个排序完毕的拷贝且不对原列表做任何修改。如果你希望case_insensitive_sort函数也能够直接作用于原列表,只需要将return语句修改为对列表本体的赋值:
string_list[:]&=&[x[1]&for&x&in&auxiliary_list]&
反过来,在Python 2.4中,如果你希望获得一个排序完毕的拷贝,且让原列表保持不变,可以使用新的内建的sorted函数。比如,在Python 2.4中:for&s&in&sorted(string_list,&key=str.lower):&print&s&
上述代码打印列表中的每一个字符串,这些字符串根据大小写无关的规则进行排序,而且不会影响到string_list本身。
在Python 2.4的解决方案中,将str.lower作为key参数限制了你以特定的方式将字符串排序(不包括Unicode对象)。如果你知道你正在排序的是Unicode对象列表,可以使用key = unicode.lower。如果你希望函数能够同时适用于普通字符串和Unicode对象,可以import string并使用key = string.lower;另外,也可以使用key = lambda s: s.lower( )。
如果需要对字符串列表进行大小写无关的排序,可能也需要用大小写无关的字符串作为键的字典和集合,需要列表对index和count方法表现出与大小写无关的行为方式,需要在各种搜索匹配的任务中忽略掉大小写,等等。如果这是你的需求,那么真正需要的是str的一个子类型,从而在比较和哈希的时候忽略大小写-相比于实现各种容器和函数来满足这些需求,这是解决这类问题的最好的方法。参考1.24节内容,可以看到如何实现这样一种子类型。
Python Frequently Asked Questions,= faq04.051.htp;5.3节;Python 2.4的Library Reference中关于sorted内建函数,sort和sorted的key参数;1.24节。
【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:228094人学习过
讲师:92498人学习过
讲师:305547人学习过
精选博文论坛热帖下载排行
本书是由长期从事网络管理工作和网络工程人员培训工作的一线网管人员和教学人员精心编写,从现实的技术发展角度和实际应用的角度,通过大量...
订阅51CTO邮刊博客分类:
引用&&& 在做采集时,使用的是自己的API(过几天发布)做数据采集,没有使用他人写API(因为他们使用大部分是采用DOM结构和一些优化功能,在配置上有些不方便)。在字符串查找上,很重要一个是不区分大小写的查找,而java的api中没有直接提供这个方法,所以自己写,分别是模仿indexOf()和lastIndexOf(),大家踊跃指教,代码如下:
public class StringUtil {
public static void main(String[] args) {
String t="aaaaaaaaaa&table&&/table&aaa&table&&/table&";
String s="&TABLE";
System.out.println("length="+t.length());
System.out.println(t.indexOf(s,0));
System.out.println(ignoreCaseIndexOf(t, s,0));
System.out.println(t.lastIndexOf(s));
System.out.println(ignoreCaseLastIndexOf(t, s));
* 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始,不区分大小。
* @param subject 被查找字符串。
* @param search 要查找的子字符串。
* @return 指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
public static int ignoreCaseIndexOf(String subject, String search) {
return ignoreCaseIndexOf(subject, search,-1);
* 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始,不区分大小。
* @param subject 被查找字符串。
* @param search 要查找的子字符串。
* @param fromIndex 开始查找的索引位置。其值没有限制,如果它为负,则与它为 0 的效果同样:将查找整个字符串。
如果它大于此字符串的长度,则与它等于此字符串长度的效果相同:返回 -1。
* @return 指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
public static int ignoreCaseIndexOf(String subject, String search,
int fromIndex) {
//当被查找字符串或查找子字符串为空时,抛出空指针异常。
if (subject == null || search == null) {
throw new NullPointerException("输入的参数为空");
fromIndex = fromIndex & 0 ? 0 : fromI
if (search.equals("")) {
return fromIndex &= subject.length() ? subject.length() : fromI
int index1 = fromI
int index2 = 0;
loop1: while (true) {
if (index1 & subject.length()) {
c1 = subject.charAt(index1);
c2 = search.charAt(index2);
break loop1;
while (true) {
if (isEqual(c1, c2)) {
if (index1 & subject.length() - 1
&& index2 & search.length() - 1) {
c1 = subject.charAt(++index1);
c2 = search.charAt(++index2);
} else if (index2 == search.length() - 1) {
return fromI
break loop1;
index2 = 0;
//重新查找子字符串的位置
index1 = ++fromI
return -1;
* 返回指定子字符串在此字符串中最右边出现处的索引。
* @param subject 被查找字符串。
* @param search 要查找的子字符。
* @return 在此对象表示的字符序列中最后一次出现该字符的索引;如果在该点之前未出现该字符,则返回 -1
public static int ignoreCaseLastIndexOf(String subject, String search){
if(subject==null){
throw new NullPointerException("输入的参数为空");
return ignoreCaseLastIndexOf(subject,search,subject.length());
* 返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向查找。
* @param subject 被查找字符串 。
* @param search 要查找的子字符串。
* @param fromIndex 开始查找的索引。fromIndex 的值没有限制。如果它大于等于此字符串的长度,则与它小于此字符串长度减 1 的效果相同:将查找整个字符串。
如果它为负,则与它为 -1 的效果相同:返回 -1。
* @return 在此对象表示的字符序列(小于等于 fromIndex)中最后一次出现该字符的索引;
如果在该点之前未出现该字符,则返回 -1
public static int ignoreCaseLastIndexOf(String subject, String search,
int fromIndex) {
//当被查找字符串或查找子字符串为空时,抛出空指针异常。
if (subject == null || search == null) {
throw new NullPointerException("输入的参数为空");
if (search.equals("")) {
return fromIndex &= subject.length() ? subject.length() : fromI
fromIndex = fromIndex &= subject.length() ? subject.length() - 1 : fromI
int index1 = fromI
int index2 = 0;
loop1: while (true) {
if (index1 &= 0) {
c1 = subject.charAt(index1);
c2 = search.charAt(index2);
break loop1;
while (true) {
//判断两个字符是否相等
if (isEqual(c1, c2)) {
if (index1 & subject.length() - 1
&& index2 & search.length() - 1) {
c1 = subject.charAt(++index1);
c2 = search.charAt(++index2);
} else if (index2 == search.length() - 1) {
return fromI
break loop1;
//在比较时,发现查找子字符串中某个字符不匹配,则重新开始查找子字符串
index2 = 0;
//重新查找子字符串的位置
index1 = --fromI
return -1;
* 判断两个字符是否相等。
* @param c1 字符1
* @param c2 字符2
* @return 若是英文字母,不区分大小写,相等true,不等返回false;
若不是则区分,相等返回true,不等返回false。
private static boolean isEqual(char c1,char c2){
if(((97&=c1 && c1&=122) || (65&=c1 && c1&=90))
&& ((97&=c2 && c2&=122) || (65&=c2 && c2&=90))
&& ((c1-c2==32) || (c2-c1==32))){
else if(c1==c2){
沙漠绿树 写道zluyuer 写道2个字符串都toLowerCase然后调用indexOf就可以了你说的这种方法可以查找到。可能是我这篇文章没有写明是在什么情况使用。在做网页采集时,提取网页里面的信息,是不能把源码大小转换的,不然采集的信息就有错误。网页是怎么写,我们必须保持原样,在这种情况下,我们要做不区分大小写查找,我这种方法是可以实现的。
toLowerCase是生成新的字符串,你找到子串的位置就行了,原来的串不变嘛,原样采集
你的方法是可以。你这样就相当于相同的网页源码在内存中保存了两份,当你做大量采集时,内存资源是很宝贵的。虽然你转换后,字符的比较上要少一种情况,减少了时间,但是在换上也耗费了时间。
zluyuer 写道2个字符串都toLowerCase然后调用indexOf就可以了你说的这种方法可以查找到。可能是我这篇文章没有写明是在什么情况使用。在做网页采集时,提取网页里面的信息,是不能把源码大小转换的,不然采集的信息就有错误。网页是怎么写,我们必须保持原样,在这种情况下,我们要做不区分大小写查找,我这种方法是可以实现的。toLowerCase是生成新的字符串,你找到子串的位置就行了,原来的串不变嘛,原样采集
2个字符串都toLowerCase然后调用indexOf就可以了你说的这种方法可以查找到。可能是我这篇文章没有写明是在什么情况使用。在做网页采集时,提取网页里面的信息,是不能把源码大小转换的,不然采集的信息就有错误。网页是怎么写,我们必须保持原样,在这种情况下,我们要做不区分大小写查找,我这种方法是可以实现的。
浏览: 308278 次
来自: 深圳
找到了,太坑爹了。
按照你说的例子,主备说的是dbtest1,dbtest2,db ...
问个问题:一个数据库的表的全部数据只分布在一个cobar上。多 ...
多谢,一直被这个问题困扰
多谢 解决了这个蛋疼的问题。。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&JavaScript怎么实现字符串不区分大小写的判断
请问如何在javascript中进行不区分大小写的字符串比较!
解决方法 1:
&script language="JavaScript"&
var a = "aBc";
var b = "AbC";
if (a.toLowerCase()==b.toLowerCase())
alert("ok");

我要回帖

更多关于 js字符串忽略大小写 的文章

 

随机推荐