4.3 字符串方法
第3章介绍了很多列表的方法,字符串的方法比列表还多,因为字符串从string模块中“继承”了很多方法。
因为字符串的方法比较多,所示这里只介绍一些特别有用的方法,全部方法见附录A。
4.3.1 find()方法
find()方法用于检测字符串中是否包含子字符串str。如果指定beg(开始)和end(结束)范围,就检查是否包含在指定范围内。如果包含子字符串,就返回开始的索引值;否则返回-1。
find()方法的语法如下:
str.find(str, beg=0, end=len(string))
此语法中,str代表指定检索的字符串;beg代表开始索引,默认为0;end代表结束索引,默认为字符串的长度。返回结果为子串所在位置的最左端索引,如果没有找到,就返回-1。
该方法使用示例如下:
>>> field='do it now' >>> field.find('do') 0 >>> field.find('now') 6 >>> field.find('python') -1
由输出结果看到,如果找到字符串,就返回对应的索引值;如果没找到字符串;就返回-1。
提 示
字符串的find方法返回的不是布尔值。如果返回0,就表示在索引0处找到了子字符串。
find方法还可以接受参数,用于表示起始点和结束点,例如:
>>> field.find('it',2) #提供起点 3 >>> field.find('it',5) #提供起点 -1 >>> field.find('it',0,3) #提供起点和终点 -1 >>> field.find('it',0,5) 3 >>> field.find('it',5,10) -1
由输出结果看到,可以通过使用起始值和终止值查找指定的范围内是否存在指定字符串。
4.3.2 join()方法
join()方法用于将序列中的元素以指定字符连接成一个新字符串。
join()方法的语法如下:
str.join(sequence)
此语法中,str代表指定检索的字符串,sequence代表要连接的元素序列。返回结果为指定字符连接序列中的元素后生成的新字符串。
该方法使用示例如下:
>>> num=[1,2,3,4] >>> mark='+' >>> mark.join(num) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: sequence item 0: expected str instance, int found >>> num.join(mark) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute 'join' >>> field=['1','2','3','4','5'] >>> print('连接字符串列表:',mark.join(field)) 连接字符串列表: 1+2+3+4+5 >>> field.join(mark) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list' object has no attribute 'join' >>> dirs='','home','data','hdfs' >>> print('路径:','/'.join(dirs)) 路径: /home/data/hdfs
由输出结果看到,进行join操作时,调用和被调用的对象都必须是字符串,任意一个不是字符串都会报错。
4.3.3 lower()方法
lower()方法用于将字符串中所有大写字符转换为小写。
lower()方法的语法如下:
str.lower()
此语法中,str代表指定检索的字符串,该方法不需要参数。返回结果为字符串中所有大写字符转换为小写后生成的字符串。
该方法使用示例如下:
>>> field='DO IT NOW' >>> print('调用lower得到字符串:',field.lower()) 调用lower得到字符串: do it now >>> greeting='Hello,World' >>> print('调用lower得到字符串:',greeting.lower()) 调用lower得到字符串: hello,world
由输出结果看到,字符串中的大写字母全部转换为小写字母了。
如果想要编写“不区分大小写”的代码,就可以使用lower方法。如果想要在一个字符串中查找某个子字符串并忽略大小写,也可以使用lower方法,操作如下:
>>> field='DO IT NOW' >>> field.find('It') #都不转换为小写,找不到匹配字符串 -1 >>> field.lower().find('It') #被查找字符串不转换为小写,找不到匹配字符串 -1 >>> field.lower().find('It'.lower()) #使用lower方法转换成小写后查找 3
由输出结果看到,字符串全部转换为小写后能匹配到对应子串。
提 示
有时类似于lower这样的字符串方法并不能如我们所愿进行工作。对于英文字符串,lower方法在处理时一点问题都没有;对于非英文字符串,lower方法在处理时可能不如我们的预期,如中文、挪威文等。
4.3.4 upper()方法
upper()方法用于将字符串中的小写字母转换为大写字母。
upper()方法语法如下:
str.upper()
此语法中,str代表指定检索的字符串,该方法不需要参数。返回结果为小写字母转换为大写字母的字符串。
该方法使用示例如下:
>>> field='do it now' >>> print('调用upper得到字符串:',field.upper()) 调用upper得到字符串: DO IT NOW >>> greeting='Hello,World' >>> print('调用upper得到字符串:',greeting.upper()) 调用upper得到字符串: HELLO,WORLD
由输出结果看到,字符串中的小写字母全部转换为大写字母了。
如果想要编写“不区分大小写”的代码,就可以使用upper方法。如果想要在一个字符串中查找某个子字符串并忽略大小写,也可以使用upper方法,操作如下:
>>> field='do it now' >>> field.find('It') #都不转换为大写,找不到匹配字符串 -1 >>> field.upper().find('It') #被查找字符串不转换为大写,找不到匹配字符串 -1 >>> field.upper().find('It'.upper()) #使用upper方法转换为大写后查找 3
由输出结果看到,字符串全部转换为大写后能找到对应子串。
4.3.5 swapcase()方法
swapcase()方法用于对字符串的大小写字母进行转换,将字符串中的大写字母转换为小写、小写字母转换为大写。
swapcase()方法的语法如下:
str.swapcase()
此语法中,str代表指定检索的字符串,该方法不需要参数。返回结果为大小写字母转换后生成的新字符串。
该方法使用示例如下:
>>> field='Just do it,NOW' >>> print('原字符串:',field) 原字符串: Just do it,NOW >>> print('调用swapcase方法后得到的字符串:',field.swapcase()) 调用swapcase方法后得到的字符串: jUST DO IT,now
由输出结果看到,调用该方法后,输出结果中的大写字母变为小写、小写字母变为大写。该方法进行大小写转换非常方便。
4.3.6 replace()方法
replace()方法把字符串中的old(旧字符串)替换成new(新字符串),如果指定第3个参数max,替换次数就不超过max次。
replace()方法的语法如下:
str.replace(old, new[, max])
此语法中,str代表指定检索的字符串;old代表将被替换的子字符串;new代表新字符串,用于替换old子字符串;max代表可选字符串,替换次数不超过max次。返回结果为字符串中的old(旧字符串)替换成new(新字符串)后生成的新字符串,如果指定第3个参数max,替换次数就不超过max次。
该方法使用示例如下:
>>> field='do it now,do right now' >>> print('原字符串:',field) 原字符串: do it now,do right now >>> print('新字符串:',field.replace('do','Just do')) 新字符串: Just do it now,Just do right now >>> print('新字符串:',field.replace('o','Just',1)) 新字符串: dJust it now,do right now >>> print('新字符串:',field.replace('o','Just',2)) 新字符串: dJust it nJustw,do right now >>> print('新字符串:',field.replace('o','Just',3)) 新字符串: dJust it nJustw,dJust right now
由上面的输出结果看到,当不指定第3个参数时,所有匹配字符都替换;指定第3个参数时,替换从左往右进行,替换次数不超过指定次数。
4.3.7 split()方法
split()方法通过指定分隔符对字符串进行切片,如果参数num有指定值,就只分隔num个子字符串。这是一个非常重要的字符串方法,是join的逆方法,用来将字符串分割成序列。
split()方法的语法如下:
str.split(st="", num=string.count(str))
此语法中,str代表指定检索的字符串;st代表分隔符,默认为空格;num代表分割次数。返回结果为分割后的字符串列表。
该方法使用示例如下:
>>> field='do it now' >>> print('不提供任何分割符分隔后的字符串:',field.split()) 不提供任何分割符分隔后的字符串: ['do', 'it', 'now'] >>> print('根据i分隔后的字符串:',field.split('i')) 根据i分隔后的字符串: ['do ', 't now'] >>> print('根据o分隔后的字符串:',field.split('o')) 根据o分隔后的字符串: ['d', ' it n', 'w'] >>> print('根据o分隔1次后的字符串:',field.split('o',1)) 根据o分隔1次后的字符串: ['d', ' it now']
由输出结果看到,如果不提供分隔符,程序就会把所有空格作为分割符。操作中可以指定分隔符和分割次数,若指定分割次数,则从左往右检索和分隔符匹配的字符,分割次数不超过指定次数;若不指定分割次数,则所有匹配的字符都会被分割。
4.3.8 strip()方法
strip()方法用于移除字符串头尾指定的字符(默认为空格)。
strip()方法的语法如下:
str.strip([chars])
此语法中,str代表指定检索的字符串,chars代表移除字符串头尾指定的字符。返回结果为移除字符串头尾指定的字符生成的新字符串。
该方法使用示例如下:
>>> field='----do it now----' >>> print('原字符串:',field) 原字符串: ----do it now---- >>> print('新字符串:',field.strip('-')) 新字符串: do it now >>> st='----do -- it -- now----' >>> print('原字符串:',st) 原字符串: ----do -- it -- now---- >>> print('新字符串:',st.strip('-')) 新字符串: do -- it -- now
由操作结果看到,strip方法只去除头尾匹配的字符,中间匹配的字符不会去除。
4.3.9 translate()方法
translate()方法根据参数table给出的表(包含256个字符)转换字符串的字符,将要过滤掉的字符放到del参数中。
translate()方法的语法如下:
str.translate(table[, deletechars])
此语法中,str代表指定检索的字符串;table代表翻译表,翻译表通过maketrans方法转换而来;deletechars代表字符串中要过滤的字符列表。返回结果为翻译后的字符串。
该方法使用示例如下:
>>> intab='adefs' >>> outtab='12345' >>> trantab=str.maketrans(intab,outtab) >>> st='just do it' >>> print('st调用translate方法后:',st.translate(trantab)) st调用translate方法后: ju5t 2o it
由输出结果看到,有几个字符被替换成数字了,被替换的字符既在intab变量中,又在st变量中,如图4-1所示。对于既在intab中,又在st中的字符,使用outtab中对应的字符替换。由图4-1可知,intab中的字符d对应outtab中的字符2、字符s对应字符5,所以最后输出字符串中的s被替换成5、d被替换成2,这样就得到了最后我们看到的字符串ju5t 2o it。
图4-1 字符串对应关系
translate方法和replace方法一样,可以替换字符串中某些部分。和replace方法不同的是,translate方法只处理单个字符。translate方法的优势在于可以同时进行多个替换,有时比replace方法效率高得多。