目录
一、从字符串中检索单个字符
练习-1 计算数字总和
二、检索部分字符串
练习-2 逆序显示字符串
三、设置字符串格式
1.使用%进行字符串格式化
2.使用format方法
3.f-string
四.字符串方法
1.center
2.find
3.join
4.lower
5.upper
6.title
7.swapcase
8.判断字符串是否为大写/小写
8.1 islower
8.2 isupper
9.replace
10.split
11.strip
12.translate
13.判断字符串是否满足特定条件
练习-3 改变名字的顺序
练习-4 创建一个登录ID
练习-5 创建一个随即单词
练习反转数字
Python支持许多字符串操作函数和方法,这里介绍最常用的。
以文本“Hello World”为例,该字符串由11个字符组成,包括两个单词之间的空格字符(space),每个字符的位置如下图所示:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
H | e | l | l | o | W | o | r | l | d |
第一个字符串的位置是0,两个单词之间的空格也是一个字符(空格的 ASCII 值为 32)。
Python允许使用所谓的子串表示法检索字符串的单个字符。可以使用索引0访问第一个字符,索引1访问第二个字符,以此类推。最后一个字符的索引值比字符串的长度小1。以下程序是一个例子:
a = "Hello World"
print(a[0])#It displays: H
print(a[6])#It displays: W
print(a[10])#It displays:d
如果希望从字符串的末尾处开始计数,可以使用负向索引。例如:索引-1指的是最右边的字符。在文本"Hello World"中,每个字符位置的负向索引如下:
-11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
H | e | l | l | o | W | o | r | l | d |
示例如下:
a = "Hello World"
print(a[-1])#It displays: d
print(a[-11])#It displays: H
使用无效索引值Python会显示错误。
编写一个Python程序,提示用户输入一个3位数的整数,然后计算3位数字的和。
主要思想:将给定的字符转化为字符串,然后将每个数位(亦被转化为字符)分解到单个变量中做运算。
n = int(input("Enter an three-digit integer:"))
digit1, digit2, digit3 = str(n)
total = int(digit1) + int(digit2) + int(digit3)
print(total)
在Python中,如果想从字符串中提取一部分内容,可以使用如下的切片语法:
subject[beginIndex:endIndex:step]
这个语法会返回 subject
字符串的一个子串。具体来说:
示例如下:
a = "Hello World"
print(a[7:9]) #It displays the letters o,and r
print(a[4:10:2]) #It displays the letters o, W, and r
print(a[7:]) #It displays the letters o, r, l and d
print(a[:3]) #It displays the letters H, e, and l
如果希望从字符串的末尾开始计数,可使用下例所示的负数索引:
a = "Hello World"
print(a[3:-2]) #It displays "lo Wor"
print(a[-4:-2]) #It displays "or"
print(a[-3:]) #It displays "rld"
print(a[:-3]) #It displays "Hello Wo"
编写一个Python程序,提示用户输入任意一个具有4个字母的单词,然后逆序显示其内容。
这个问题可以有3种不同的解法:
第1种方式:假设用户的输入内容被赋给变量s。使用索引一次访问第4、3、2、1个字母。
Python程序如下所示:
s = input("Enter a word with four letters: ")
s_rev = s[3] + s[2] +s[1] +s[0]
print(s_rev)
第2种方式:将4个字母分解到4个变量中。Python程序如下所示:
s = input("Enter a word with four letters: ")
a, b, c, d = s
s_rev = d + c + b + a
print(s_rev)
第3种方式:使用-1作为参数step的值。Python程序如下所示:
s = input("Enter a word with four letters: ")
s_rev = s[::-1]
print(s_rev)
将变量的值转换为字符串并插入到文本中是非常常见且重要的操作,称之为 "字符串格式化"。
这是python早期使用的字符串格式化方法,类似于c语言中的printf语法:在%左边指定一个字符串,并在右边指定要设置其格式的值。指定要设置格式的值时,可使用单个值(字符串或数字),可使用元组(如果要设置多个值的格式),还可以使用字典,其中元组最常见。
>>> format="Hello, %s. %s enough for ya?"
>>> values=("world","Hot")
>>> print(format % values)
Hello, world. Hot enough for ya?
这里的%s被称为转换说明符,表示要将值插入字符串中的位置,并以字符串形式显示。如果指定的值不是字符串,将使用str将其转换为字符串。例如:%.3f表示将值设置为包含3位小数的浮点数。
format方法用花括号{ }占位,然后用.format()来填值:
>>> "{}, {} and {}".format('first','second','third')
'first, second and third'
>>> "{0},{1} and {2}".format('first','second','third')
'first,second and third'
还可以设置格式,比如保留几位小数:
>>> "{name} is approximately {value:.2f}.".format(value=pi,name="Π")
'Π is approximately 3.14.'
从python3.6开始,引入了一种更简洁、更直观的方式来处理字符串格式化,这就是f-string。它的核心思想是:在字符串前加上一个f,然后在字符串中直接使用花括号{}来引用变量名:
>>> from math import e
>>> f"Euler's constant is roughly {e}."
"Euler's constant is roughly 2.718281828459045."
e=2.7182
print(f"Euler's constant is roughly {e}.")
name = "Alice"
age = 30
print(f"My name is {name} and I am {age} years old.")
方法centet通过在两边添加填充字符(默认为空格)让字符串居中:
>>> "The Middle by Jimmy Eat World".center(39)
' The Middle by Jimmy Eat World '
>>> "The Middle by Jimmy Ear World.".center(39,'*')
'*****The Middle by Jimmy Ear World.****'
find方法在字符串中查找子串,如果找到,就返回子串的第一个字符的索引,否则返回-1.
>>> 'with a moo-moo here,and a moo-moo there'.find('moo')
7
>>> title="Montly Python's Flying Circus"
>>> title.find('Montly')
0
find方法可以指定搜索的起点和终点:
>>> subject='$$$ Get rich now!!! $$$'
>>> subject.find('$$$')
0
>>> subject.find('$$$',1)#只指定起点
20
>>> subject.find('!!!')
16
>>>
!!请注意,搜索范围包含起点,不包含终点。
join用于合并序列的元素,其作用与split相反,是一个很重要的字符串方法:
>>> seq=[1,2,3,4,5]
>>> sep='+'
>>> sep.join(seq)#尝试合并一个字符串列表
Traceback (most recent call last):
File "", line 1, in
TypeError: sequence item 0: expected str instance, int found
>>> seq=['1','2','3','4','5']
>>> sep.join(seq)#合并一个字符串列表
'1+2+3+4+5'
>>> dirs='','usr','bin','env'
>>> '/'.join(dirs)
'/usr/bin/env'
>>> print('C:'+'\\'.join(dirs))
C:\usr\bin\env
上述例子告诉我们,join方法适用于任何可迭代的对象,如列表、元组等,但是所合并的序列必须是字符串。如果尝试连接非字符串类型的元素,会抛出typeerror
a = "Hello Olympians!"
print(len(a))#It displays:16
b = "I am newbie in Python"
k = len(b)
print(k)#It displays:21
lower方法返回字符串的小写版本。例如,检查列表中是否包含指定的用户名而忽略大小写的差别,就可以使用这个方法。
>>> 'Today is Sunny'.lower()
'today is sunny'
upper方法将字符串中的所有小写字母转换为大写字母:
>>> 'Today is Sunny'.upper()
'TODAY IS SUNNY'
title方法将字符串中每个单词的首字母转换成大写,其余字母小写:
>>> 'TODAY IS SUNNY'.title()
'Today Is Sunny'
swapcase方法将字符串中大写字母转换成小写,小写字母转换成大写:
>>> 'Today Is Sunny'.swapcase()
'tODAY iS sUNNY'
islower方法检查字符串中所有字母是否均为小写,并返回一个布尔值:
s = "hello world"
print(s.islower()) # 输出: True
s = "Hello World"
print(s.islower()) # 输出: False
isupper方法检查字符串中的所有字母是否都是大写,并返回一个布尔值:
s = "HELLO WORLD"
print(s.isupper()) # 输出: True
s = "Hello World"
print(s.isupper()) # 输出: False
replace方法将指定子串替换为另一个字符串,并返回替换后结果:
>>> 'This is a test.'.replace('is','eez')
'Theez eez a test.'
split非常常见且重要,用于将字符串拆分成序列,与join作用相反:
>>> '1+2+3+4+5'.split('+')
['1', '2', '3', '4', '5']
>>> '/usr/bin/env'.split('/')
['', 'usr', 'bin', 'env']
如果没有指定分隔符,将默认在单个或多个连续的空白字符(空格、制表符、换行符等)处进行拆分。
strip方法将字符串开头和末尾的空白(但不包括中间的空白)删除并返回删除后的结果:
>>> ' internal whitespace is kepr '.strip()
'internal whitespace is kepr'
假定用户输入用户名时不小心在末尾加了一个空格,strip就很有用:
>>> names=['gumby','smith','jones']
>>> name='gumby '
>>> if name in names:print('Found it!')
...
>>> if name.strip() in names:print('Found it!')
...
Found it!
strip方法还可以在字符串中指定要删除哪些字符(还是只能删除开头和结尾的指定字符,不包括中间的):
>>> '*** SPAM * for *everyone!!!***'.strip('*!')
' SPAM * for *everyone'
translate方法与replace一样替换字符串的特定部分,但只能进行单字符替换。这个方法能够同时替换多个字符,因此效率比replace高。
使用translate之前必须创立一个转换表。这个转换表指出了不同Unicode码之间的转换关系。要创建转换表,可对字符串类型str调用maketrans方法。maketrans是一个辅助函数,它的基本用法如下:
table=str.maketrans(x,y,z)
这个方法接受3个参数:x和y是2个长度相同的字符串,它们指定要将x字符串中的每一个字符都替换为y字符串中的相应字符,z是可选字符串,表示需要删除的字符。
创建转换表后,可以将其作为参数传给translate方法,对字符串进行替换或删除操作:
new_string=original_string.translate(table)
示例1:将英文文本转换为带有德国口音的版本
假设我们要将一段英文文本转换为带有德国口音的版本,为此需要将字符c 替换为k,将字符s 替换为z。
#1.创建转换表
table = str.maketrans('cs','kz')
#2.使用translate进行替换
original_text = "this is an incredible test"
translated_text = original_text.translate(table)
print(translated_text)#输出 thiz iz an inkredible tezt
示例2:将所有空格删除(模仿语速极快的德国口音)
#1.创建转换表
table = str.maketrans('cs','kz',' ')
#2.使用translate进行替换
original_text = "this is an incredible test"
translated_text = original_text.translate(table)
print(translated_text)#输出 thizizaninkredibletezt
很多字符串方法以is打头,如isspace、isdigit和isupper,它们分别判断字符串是否全为空白、数字或大写,类似的还有isalnum、isalpha、isdecimal、isidentifier、islower、isnumeric、isprintable、istitle等。
编写一个Python程序,提示用户输入一个由名和姓构成的字符串。最后,程序改变名和姓的顺序。
解答:
这个练习的思路是拆分字符串并将名和姓赋给不同的变量。以Tom Smith为例,需要拆分的字符串和各字符的位置如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
T | o | m | S | m | i | t | h |
区分名和姓的方法在于它们之间的空格,问题是空格字符位置在不同名字里的位置不同。因此需要find()方法查找并返回空格字符的位置,该位置也是名字第一个单词的字符数量。
该问题的Python程序实现如下:
full_name = input("Enter your full name: ")
#Find the poisition of space character.This is also the number of characters first name contains
space_pos = full_name.find(" ")
#Get space_pos number of characters staring from position 0
name1 = full_name[:space_pos]
#Get the rest of the characters starting from position space_pos + 1
name2 = full_name[space_pos + 1:]
full_name = name2 + " " + name1
print(full_name)
编写一个Python程序,提示用户输入姓氏,然后取姓氏的前4个字母(小写)和一个随即的3位整数创建一个登录ID。
解答:
要创建一个随机整数可以用randrange()函数。由于需要3位随机整数。因此数字范围必须介于100~999。
该问题的Python程序实现如下:
import random
last_name = input("Enter last name: ")
#Get random integer between 100 and 999
random_num = random.randrange(100,1000)
print(last_name[:4].lower()+str(random_num))
编写一个Python程序,输出一个由3个字母组成的随即单词。
解答:
创建随即单词需要用到常量ascii_lowercase,它包含所有英语字母。因此首先导入string模块,然后使用randrange()方法在0和25之间随机选择字母。
该问题的Python程序实现如下:
import string
import random
alphabet = string.ascii_lowercase
random_word = alphabet[random.randrange(26)]+\
alphabet[random.randrange(26)]+\
alphabet[random.randrange(26)]
print(random_word)
此处的26也可以用len(ascii_lowercase)代替。
编写一个Python程序,提示用户输入一个整数,然后将其反转。例如,如果用户输入数字375,程序输出数字375。
解答:
本题有多种解法,例如用取商(//)和取余(%)运算符的方法。本章学习的字符串操作也可以完成这个问题。方法是,将给定的整数转化为字符串,然后反转字符串,并将其转换为整数。
本题解法如下:
number = int(input("Enter an integer: "))
#Convert the number to string
number_string = str(number)
#Reverse the strnig
reversed_string = number_string[::-1]
#Convert the revered string to integer:
reversed_number = int(reversed_string)
print(reversed_number)
也可以采用更简洁的代码:
number = int(input("Enter an integer: "))
reversed_number = int(str(number)[::-1])
print(reversed_number)