好好学Python:从零基础到项目实战
上QQ阅读APP看书,第一时间看更新

4.3 字符串方法

本节将介绍字符串方法,字符串的方法非常多,这是因为字符串从string模块中“继承”了很多方法。本节只介绍一些常用的字符串方法,全部的字符串方法可以参见附录A。

4.3.1 split()方法

split()方法通过指定分割符对字符串进行切片。split()方法的语法格式如下:

str.split(st="", num=string.count(str))

此语法中,str代表指定检索的字符串;st代表分割符,默认为空格;num代表分割次数。返回结果为分割后的字符串列表。

如果参数num有指定值,就只分割num个子字符串。这是一个非常重要的字符串方法,用来将字符串分割成序列。

该方法的使用示例如下:

>>> say='stay hungry stay foolish'
>>> print('不提供任何分割符分割后的字符串:',say.split())
不提供任何分割符分割后的字符串: ['stay', 'hungry', 'stay', 'foolish']
>>> print('根据字母t分割后的字符串:',say.split('t'))
根据字母t分割后的字符串: ['s', 'ay hungry s', 'ay foolish']
>>> print('根据字母s分割后的字符串:',say.split('s'))
根据字母s分割后的字符串: ['', 'tay hungry ', 'tay fooli', 'h']
>>> print('根据字母s分割2次后的字符串:',say.split('s',2))
根据字母s分割2次后的字符串: ['', 'tay hungry ', 'tay foolish']

由输出结果可以看到,split()方法支持各种方式的字符串分割。如果不提供分割符,程序就默认把所有空格作为分割符。split()方法中可以指定分割符和分割次数,若指定分割次数,则从左往右检索和分割符匹配的字符,分割次数不超过指定分割符被匹配的次数;若不指定分割次数,则所有匹配的字符都会被分割。

在实际项目应用中,split()方法应用的频率比较高,特别是在文本处理或字符串处理的业务中,经常需要使用该方法做一些字符串的分割操作,以得到某个值。

4.3.2 strip()方法

strip()方法用于移除字符串头尾指定的字符,strip()方法的语法格式如下:

str.strip([chars])

该语法中,str代表指定检索的字符串,chars代表移除字符串头尾指定的字符,chars可以为空。strip()方法有返回结果,返回结果是字符串移除头尾指定的字符后所生成的新字符串。

若不指定字符,则默认为空格。

该方法的使用示例如下:

>>>say=' stay hungry stay foolish '  #字符串前后都带有空格
>>> print(f'原字符串:{say},字符串长度为:{len(say)}')
原字符串: stay hungry stay foolish ,字符串长度为:26
>>> print(f'新字符串:{say.strip()},新字符串长度为:{len(say.strip())}')
新字符串:stay hungry stay foolish,新字符串长度为:24
>>> say='--stay hungry stay foolish--'
>>> print(f'原字符串:{say},字符串长度为:{len(say)}')
原字符串:--stay hungry stay foolish--,字符串长度为:28
>>> print(f'新字符串:{say.strip("-")},新字符串长度为:{len(say.strip("-"))}')
新字符串:stay hungry stay foolish,新字符串长度为:24
>>> say='--stay-hungry-stay-foolish--'
>>> print(f'原字符串:{say},字符串长度为:{len(say)}')
原字符串:--stay-hungry-stay-foolish--,字符串长度为:28
>>> print(f'新字符串:{say.strip("-")},新字符串长度为:{len(say.strip("-"))}')
新字符串:stay-hungry-stay-foolish,新字符串长度为:24

由输出结果可以看到,strip()方法只移除字符串头部和尾部能匹配到的字符,中间的字符不会移除。

在实际项目应用中,strip()方法使用得比较多,特别在对字符串进行合法性校验时,一般都会先做一个移除首尾空格的操作。当字符串不确定在首尾是否有空格时,一般也会先用strip()方法操作一遍。

4.3.3 join()方法

join()方法用于将序列中的元素以指定字符串连接成一个新字符串。join()方法的语法格式如下:

str.join(sequence)

此语法中,str代表指定的字符串,sequence代表要连接的元素序列。返回结果为指定字符串连接序列中元素后生成的新字符串。

该方法的使用示例如下:

由输出结果可以看到,join()方法只能对字符串元素进行连接,用join()方法进行操作时,调用和被调用的对象必须都是字符串,任意一方不是字符串,最终操作结果都会报错。

在实际项目应用中,join()方法应用得也比较多,特别是在做字符串的连接时,使用join()方法的效率比较高,占用的内存空间也小。在路径拼接时,使用join()是个不错的选择。

4.3.4 find()方法

find()方法用于检测字符串中是否包含指定的子字符串。find()方法的语法格式如下:

str.find(str, beg=0, end=len(string))

此语法中,str代表指定检索的字符串,beg代表开始索引的下标位置,默认为0;end代表结束索引的下标位置,默认为字符串的长度。返回结果为匹配字符串所在位置的最左端索引下标值,如果没有找到匹配字符串,就返回-1。

该方法的使用示例如下:

>>> say='stay hungry,stay foolish'
>>> print(f'say字符串的长度是:{len(say)}')
say字符串的长度是:24
>>> say.find('stay')
0
>>> say.find('hun')
5
>>> say.find('sh')
22
>>> say.find('python')
-1

由输出结果可以看到,使用find()方法时,如果找到字符串,就返回该字符串所在位置最左端的索引下标值,若字符串的第一个字符是匹配的字符串,则find()方法返回的索引下标值是0,如果没找到字符串,则返回-1。

find()方法还可以接收起始索引下标参数和结束索引下标参数,用于表示字符串查找的起始点和结束点,例如:

>>> say='stay hungry,stay foolish'
>>> say.find('stay',3)              #提供起点
12
>>> say.find('y',3)                 #提供起点
3
>>> say.find('hun',3)               #提供起点
5
>>> say.find('stay',3,10)           #提供起点和终点
-1
>>> say.find('stay',3,15)           #提供起点和终点
-1
>>> say.find('stay',3,18)           #提供起点和终点
12

由输出结果可以看到,find()方法可以只指定起始索引下标参数查找指定子字符串是否在字符串中,也可以指定起始索引下标参数和结束索引下标参数查找子字符串是否在字符串中。

在实际项目应用中,find()方法的使用不是很多,一般在想要知道某个字符串在另一个字符串中的索引下标位置时使用较多,其余情形使用比较少。

4.3.5 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()方法做统一转换。如果想要在一个字符串中查找某个子字符串并忽略大小写,也可以使用lower()方法,操作如下:

    >>> field='DO IT NOW'
    >>> field.find('It')               #field字符串不转换为小写字母,找不到匹配字符串
    -1
    >>> field.lower().find('It')  #field字符串先转换为小写字母,但It不转为小写字母,找
不到匹配字符串
    -1
    >>> field.lower().find('It'.lower())  #都使用lower()方法转换成小写字母后查找
    3

由输出结果可以看到,使用lower()方法,对处理那些忽略大小写的字符串匹配非常方便。

在实际项目应用中,lower()方法的应用也不是很多,lower()方法的主要应用场景是将字符串中的大写字母转换为小写字母,或是在不区分字母大小写时比较字符串,其他场景应用相对少。

4.3.6 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

由输出结果可以看到,使用upper()方法,对处理那些忽略大小写的字符串匹配非常方便。

在实际项目应用中,upper()方法的应用也不是很多,upper()方法的主要应用场景是将字符串中的小写字母都转换为大写字母,或是在不区分字母大小写时比较字符串,其他场景应用相对少。

4.3.7 replace()方法

replace()方法用于做字符串替换。replace()方法的语法格式如下:

str.replace(old, new[, max])

此语法中,str代表指定检索的字符串;old代表将被替换的子字符串;new代表新字符串,用于替换old子字符串;max代表可选字符串,如果指定了max参数,则替换次数不超过max次。

返回结果为将字符串中的old(旧字符串)替换成new(新字符串)后生成的新字符串。

该方法的使用示例如下:

>>> 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

由输出结果可以看到,使用replace()方法时,若不指定第3个参数,则字符串中所有匹配到的字符都会被替换;若指定第3个参数,则从字符串的左边开始往右进行查找匹配并替换,达到指定的替换次数后,便不再继续查找,若字符串查找结束仍没有达到指定的替换次数,则结束。

从Python 3.9开始,对replace()方法做了一些修复,对如下示例,Python 3.9之前的操作结果形式为:

>>> "".replace("", "python", 1)
''
>>> "".replace("", "python", 2)
''

由输出结果看到,对形如"".replace("",s,n)的操作,对于所有非零的n,返回的是空字符串而不是python这个字符串,这样的结果会使用户感到困惑,很容易导致应用程序的不一致行为,从Python 3.9开始,输出结果修正为如下:

>>> "".replace("", "python", 1)
'python'
>>> "".replace("", "python", 2)
'python'

由输出结果看到,从Python 3.9开始,对形如"".replace("",s,n)的操作,对于所有非零的n,返回的是字符串s,对之前的问题已经做了修复,也解决了广大用户的困惑。

在实际项目应用中,replace()方法的应用不多,遇到需要使用稍微复杂的替换时,可以查阅相关文档。

4.3.8 swapcase()方法

swapcase()方法的语法格式如下:

str.swapcase()

此语法中,str代表指定检索的字符串,该方法不需要参数。返回结果为大小写字母转换后生成的新字符串。

swapcase()方法用于对字符串中的大小写字母进行转换,将字符串中的大写字母转换为小写字母、小写字母转换为大写字母。

该方法的使用示例如下:

>>> field='Just do it,NOW'
>>> print('原字符串:',field)
原字符串: Just do it,NOW
>>> print('调用swapcase方法后得到的字符串:',field.swapcase())
调用swapcase方法后得到的字符串: jUST DO IT,now

由输出结果可以看到,调用swapcase()方法后,输出结果中的大写字母变为小写字母、小写字母变为大写字母。该方法进行大小写转换非常方便。

在实际项目应用中,swapcase()方法应用得比较少。

4.3.9 translate()方法

translate()方法的语法格式如下:

str.translate(table[, deletechars])

此语法中,str代表指定检索的字符串;table代表翻译表,翻译表通过maketrans()方法转换而来;deletechars代表字符串中要过滤的字符列表。返回结果为翻译后的字符串。

translate()方法根据参数table给出的表(包含256个字符)转换字符串的字符,将要过滤掉的字符放到del参数中。

该方法的使用示例如下:

>>> intab='adefs'
>>> outtab='12345'
>>> trantab=str.maketrans(intab,outtab)
>>> st='just do it'
>>> print('st调用translate方法后:',st.translate(trantab))
st调用translate方法后: ju5t 2o it

由输出结果可以看到,使用translate()方法后,有几个字符被替换成数字了,被替换的字符既在intab变量中,又在st变量中,如图4-1所示。对于既在intab又在st中的字符,使用outtab中对应的字符替换。由图4-1可知,intab中的字符d和s对应outtab中的字符2和5,所以最后输出字符串中的d被替换成2、s被替换成5,这样就得到了最后我们看到的字符串js5t 2o it。

图4-1 字符串对应关系

translate()方法和replace()方法一样,可以替换字符串中的某些部分。但和replace()方法不同的是,translate()方法只处理单个字符,而translate()方法的可以同时进行多个替换,有时比replace()方法的效率高很多。

在实际项目应用中,translate()方法的使用属于比较高级的应用,学有余力的读者可以多做一些深入了解。

4.3.10 移除前缀和后缀方法

从Python 3.9开始,增加了str.removeprefix(prefix)和str.removesuffix(suffix)用于方便地从字符串移除不需要的前缀或后缀。看如下使用示例:

>>> exp_str = 'learn_python'
>>> print(f'移除前缀learn_得到结果:{exp_str.removeprefix("learn_")}')
移除前缀learn_得到结果:python
>>> print(f'移除后缀_python得到结果:{exp_str.removesuffix("_python")}')
移除后缀_python得到结果:learn

由输出结果可以看到,使用Python内置的方法,可以很方便的从字符串中移除指定的前缀或后缀。