小小千想和您聊一聊

当前位置: 首页> 技术分享> 第4章 字符串

第4章 字符串

  本章学习目标

  l 掌握字符串的三种表现形式

  l 掌握字符串的输入与输出

  l 掌握字符串的索引与分片

  l 了解字符串的运算

  l 熟悉字符串常用函数

  字符串是许多单个子串组成的序列,其主要是用来表示文本。例如,登录网站时输入的用户名与密码等。灵活地使用与处理字符串,对于Python程序员来说是非常重要的。

  4.1 字符串简介

  在汉语中,将若干个字连起来就是一个字符串,例如“千锋教育”就是一个由四个汉字组成的字符串。在程序中,字符串是由若干字符组成的序列。

  4.1.1 字符串的概念

  在前面章节中,大家已接触过简单字符串,Python中的字符串以引号包含为标识,具体有三种表现形式:

  1. 使用单引号标识字符串

  使用单引号标识的字符串中不能包含单引号,具体如下所示:

  'xiaoqian'

  '666'

  '小千说:"坚持到感动自己,拼搏到无能为力"。'

  2. 使用双引号标识字符串

  使用双引号标识的字符串中不能包含双引号,具体如下所示:

  "xiaoqian"

  "666"

  "I'll do my best."

  3. 使用三引号标识字符串

  使用三对单引号或三对双引号标识字符串可以包含多行,具体如下所示:

  '''

  坚持到感动自己

  拼搏到无能为力

  '''

  """

  遇到IT技术难题

  就上扣丁学堂

  """

  这种形式的字符串经常出现在函数定义的下一行,用来说明函数的功能。

  通常使用前两种形式创建字符串,之后需要通过变量引用字符串,具体示例如下:

  name = "小千"

  print(name) # 输出小千

  注意Python中的字符串不能被修改,具体示例如下:

  name = "xiaoqian"

  name[4] = 'f' # 错误

  print(name[4]) # 正确

  虽然字符串不可以修改,但可以截取字符串一部分与其他字符串进行连接,具体示例如下:

  str = "xiaoqian is a programmer."

  print(str[0:14] + "girl")

  上述示例中,str[0:14]截取"xiaoqian is a ",然后再与"girl"进行连接,最后输出"xiaoqian is a girl"。字符串的截取与连接将会在后面小节中详细讲解。

  4.1.2 转义字符

  字符串中除了可以包含数字字符、字母字符或特殊字符外,还可以包含转义字符。转义字符以反斜杠“\”开头,后跟若干个字符。转义字符具有特定的含义,不同于字符原有的意义,故称转义字符。表4.1列出了常用的转义字符及含义。

  表4.1 常用的转义字符及含义

  在表4.1中,'\ddd'和'\xhh'都是用ASCII码表示一个字符,如'\101'和'\x41'都是表示字符'A'。转义字符在输出中有许多应用,如想在单引号标识的字符串中包含单引号,则可以使用如下语句:

  str = 'I\'ll do my best.'

  其中,“\'”表示对单引号进行转义。当解释器遇到这个转义字符时就理解这不是字符串结束标记。如果想禁用字符串中反斜杠转义功能,可以在字符串前面添加一个r,具体示例如下:

  print(r'\n表示回车换行') # 输出\n表示回车换行

  4.2 字符串的输出与输入

  在实际开发中,程序经常需要用户输入字符串并进行处理。字符串被处理完成后,又需要输出显示。上述过程就涉及到字符串的输入与输出。

  4.2.1 字符串的输出

  最简单的字符串输出如下所示:

  print("xiaoqian") # 输出xiaoqian

  此外,Python支持字符串格式化输出,具体示例如下:

  age = 18

  print("小千的年龄为%d"%age) # 输出小千的年龄为18

  字符串格式化是指按照指定的规则连接、替换字符串并返回新的符合要求的字符串,例如示例中age的内容18以整数形式替换在要显示的字符串中。字符串格式化的语法格式如下:

  format_string % string_to_convert

  format_string % (string_to_convert1, string_to_convert2, ...)

  其中,format_string为格式标记字符串,包括固定的内容与待替换的内容,待替换的内容用格式化符号标明,string_to_convert为需要格式化的数据。如果需要格式化的数据是多个,则需要使用圆括号括起来并用逗号分隔。format_string中常用的格式化符号如表4.2所示。

  表4.2 格式化符号

  接下来演示格式化符号的用法,如例4-1所示。

  例4-1

  1 name, age, id, score = "小千", 18, 1, 95.5

  2 print("学号:%d\n姓名;%s\n年龄:%d\n成绩:%f"\

  3 %(id, name, age, score))

  运行结果如图4.1所示。

  图4.1 运行结果

  在例4-1中,第1行定义4个变量,分别为name、age、id、score。第2行在print()函数中格式标记字符串,第3行为需要格式化的数据。

  除了表4.2中的格式化符号,有时需要调整格式化符号的显示样式,例如是否显示正值符号“+”,表4.3中列出了辅助格式化符号。

  表4.3 辅助格式化符号

  接下来演示辅助格式化符号的用法,如例4-2所示。

  例4-2

  1 a, b = 65, 3.1415926
  2 print("%#10x"%a)
  3 print("%-#10X"%a)
  4 print("%+d"%a)
  5 print("%5.3f"%b)
  6 print("%*.3f"%(5, b))
  7 print("%5.*f"%(3, b))

  运行结果如图4.2所示。

  图4.2 运行结果

  在例4-2中,第2行输出字符串宽度为10,并且以0x形式显示65对应的十六进制数,注意默认是右对齐的。第3行输出字符串宽度为10,并且以0X形式显示65对应的十六进制数,注意“-”代表左对齐。第4行输出字符串中正值时前加“+”。第5行输出字符串宽度为5,显示的小数点精度为3。第6行通过*设置显示宽度为5。第7行通过*设置小数点精度为3。

  4.2.2 字符串的输入

  前面的程序中,字符串都是先定义后使用。如果需在程序运行时,通过键盘输入字符串,则可以使用input()函数。它表示从标准输入读取一行文本,默认的标准设备是键盘,其语法格式如下:

  input([prompt])

  其中,prompt表示提示字符串,该函数将输入的数据作为字符串返回。

  接下来演示其用法,如例4-3所示。

  例4-3

  1 name = input("请输入用户名:")

  2 pwd = input("请输入密码:")

  3 print("用户%s的密码为%s"%(name, pwd))

  4 print(type(name))

  5 print(type(pwd))

  运行结果如图4.3所示。

  图4.3 运行结果

  在例4-3中,第1行与第2行分别通过input()函数从键盘输入字符串并通过变量名引用相应的字符串。第3行输出字符串。从运行结果可看出,当从键盘输入123时,pwd最终的数据类型为字符串类型。

  4.3 字符串的索引与分片

  字符串可以通过运算符[]进行索引与分片,字符串中每个字符都对应两个编号(也称下标),如图4.4所示。

  图4.4 字符串下标

  在图4.4中,字符串str正向编号从0开始,代表第一个字符,依次往后;字符串str负向编号从-1开始,代表最后一个字符,依次往前。因为编号可正可负,所以字符串中的某个字符可以有两种方法索引,例如索引str中字符'q',具体示例如下:

  str[4]

  str[-9]

  上述两种形式都可以索引到字符'q'。

  字符串分片是指从字符串中截取部分字符并组成新的字符串,并不会对原字符串作任何改动,其语法格式如下:

  [起始编号:结束编号:步长]

  该语句表示从起始编号处开始,以指定步长进行截取,到结束编号的前一位结束。

  接下来演示字符串的分片,如例4-4所示。

  例4-4

  1 str = "www.qfedu.com"
  2 print(str[4:9]) # 默认步长为1
  3 print(str[4:9:2]) # 设置步长为2
  4 print(str[-9:-4]) # 默认步长为1
  5 print(str[-9:-4:2]) # 设置步长为2
  6 print(str[:]) # 整个字符串
  7 print(str[:9]) # 等价于str[0:9:1]
  8 print(str[4:]) # 默认到字符串尾部(包括最后一个字符)
  9 print(str[:-9]) # 从第一个字符到编号为-9的字符(不包括编号为-9的字符)
  10 print(str[-4:]) # 从编号为-4的字符到最后一个字符(包括最后一个字符)
  11 print(str[::-2]) # 从后往前,步长为2
  12 print(str[:-9]) # 从第一个字符到编号为-9的字符(不包括编号为9的字符)

  运行结果如图4.5所示。

  图4.5 运行结果

  在例4-4中,每种形式中第一个冒号两边表示分片从何处开始及到何处结束,第二个冒号后表示步长。

  4.4 字符串的运算

  除了数字类型的数据可以参与运算外,字符串也可以参与运算,如上节中字符串通过[]运算符进行索引与分片,具体如表4.4所示。

  表4.4 字符串运算

  接下来演示字符串的运算,如例4-5所示。

  例4-5

  1 str1, str2 = "扣丁", "学堂"
  2 print(str1 + str2)
  3 print(3 * (str1 + str2))
  4 if "coding" in "coding.com":
  5 print("coding is in coding.com")
  6 else:
  7 print("coding is not in coding.com")

  运行结果如图4.6所示。

  图4.6 运行结果

  在例4-5中,第2行输出两个字符串相加的结果,第3行输出两个字符串相加并乘以3的结果,第4行判断字符串coding.com中是否包含coding。

  4.5 字符串常用函数

  在程序开发中,字符串经常需要被处理,例如,求字符串的长度、大小写转换等。如果每次处理字符串时,都编写相应的代码,那么开发效率会非常低下,为此Python提供了一些内置函数可以处理字符串常见的操作。

  4.5.1 大小写转换

  Python中涉及字符串大小写转换的函数,如表4.5所示。

  表4.5 大小写转换函数

  上述两种方法都返回一个新字符串,其中的非字母字符保持不变。如果需要进行大小写无关的比较,则这两个函数非常有用。接下来演示其用法,如例4-6所示。

  例4-6

  1 name = "xiaoqian" # 假设用户名为xiaoqian
  2 str = input("请输入用户名(不区分大小写):")
  3 if str.lower() == name:
  4 print("欢迎用户%s登录"%name)
  5 else:
  6 print("用户名错误")

  运行结果如图4.7所示。

  图4.7 运行结果

  在例4-6中,当程序运行时,用户通过键盘输入XiaoQian。第3行将字符串str通过lower()函数转换为小写并与name进行比较,如果相等,登录成功,否则登录失败。

  4.5.2 判断字符

  Python中提供了判断字符串中包含某些字符的函数,这些函数在处理用户输入的字符串时是非常方便。这些函数都是以is开头,如表4.6所示。

  表4.6 判断字符函数

  接下来演示这些函数的基本用法,如例4-7所示。

  例4-7

  1 print("xiaoqian".islower()) # True
  2 print("Xiaoqian".islower()) # 小写字母中有大写字母
  3 print("xiaoqian6666".islower()) # True
  4 print("XIAOQIAN".isupper()) # True
  5 print("XIAOqIAN".isupper()) # 大写字母中有小写字母
  6 print("XIAOQIAN6666".isupper())# True
  7 print("xiaoqian666".isalpha()) # 包含数字字符
  8 print("xiaoqian666".isalnum()) # True
  9 print("xianqian666".isdigit()) # 包含字母字符
  10 print(" \t\n".isspace()) # True
  11 print("Title".istitle()) # True

  运行结果如图4.8所示。

  图4.8 运行结果

  在例4-7中,这些函数的返回值都为布尔值。接下来演示使用这些函数验证用户输入的密码是否符合要求格式,如例4-8所示。

  例4-8

  1 while True:
  2 pwd = input("请输入您的密码(必须包含数字与字母):")
  3 if pwd.isalnum() and (not pwd.isalpha()) and (not pwd.isdigit()):
  4 print("您的密码为%s"%pwd)
  5 break
  6 else:
  7 print("重新输入!")

  运行结果如图4.9所示。

  图4.9 运行结果

  在例4-8中,程序通过循环判断用户输入的密码,其中必须包含数字与字母。从程序运行结果可看出,当输入的密码包含数字和字母时,程序才会退出循环;否则,一直提示用户输入密码。

  4.5.3 检测前缀或后缀

  在处理字符串时,有时需要检测字符串是否以某个前缀开头或以某个后缀结束,这时可以使用startswith()与endswith()函数,如表4.7所示。

  表4.7 检测前缀或后缀函数

  接下来演示这两个函数的用法,如例4-9所示。

  例4-9

  1 str = "www.codingke.com"
  2 print(str.startswith("www"))
  3 print(str.startswith("coding", 4))
  4 print(str.endswith("com"))
  5 print(str.endswith("ke", 0, 12))

  运行结果如图4.10所示。

  图4.10 运行结果

  在例4-9中,startswith()与endswith()函数中后两个参数代表检测字符串的范围。这两个函数用于检测字符串开始或结束的部分是否等于另一个字符串,其作用与等于操作符类似,这样使编程更加灵活。

  4.5.4 合并与分割字符串

  在处理字符串时,有时需要合并与分割字符串,这时可以使用join()与split()函数,如表4.8所示。

  表4.8 合并与分割函数

  接下来演示这两个函数的用法,如例4-10所示。

  例4-10

  1 seq1 = "千锋教育" # 字符串
  2 print("|".join(seq1))
  3 seq2 = ["千锋教育", "扣丁学堂", "好程序员特训营"] # 列表
  4 print("-".join(seq2))
  5 str3 = "千锋教育|扣丁学堂|好程序员特训营"
  6 print(str3.split("|"))
  7 print(str3.split("|", 1))

  运行结果如图4.11所示。

  图4.11 运行结果

  在例4-10中,第2行将“|”与字符串seq1中每个字符合并成一个新字符串。第4行将“-”与列表seq2中每个元素合并成一个新字符串。第6行将字符串str3以“|”为分割符进行分割。第7行指定分割次数为1。

  4.5.5 对齐方式

  在处理字符串时,有时需要设置字符串对齐方式,这时可以使用rjust()、ljust()和center()函数,如表4.9所示。

  表4.9 对齐方式函数

  接下来演示这三个函数的用法,如例4-11所示。

  例4-11

  1 str = "千锋教育" # 字符串
  2 print(str.rjust(10))
  3 print(str.rjust(10, '$'))
  4 print(str.ljust(10))
  5 print(str.ljust(10, '$'))
  6 print(str.center(10))
  7 print(str.center(10, '$'))

  运行结果如图4.12所示。

  图4.12 运行结果

  在例4-11中,第2行设置宽度为10、右对齐、空格填充方式显示新字符串。第3行设置宽度为10、右对齐、$填充方式显示新字符串。后面的几个函数与前面函数的用法类似,在此不再赘述。

  4.5.6 删除字符串头尾字符

  在处理字符串时,有时需要删除字符串头尾的某些字符,这时可以使用strip()、lstrip()和rstrip()函数,如表4.10所示。

  表4.10 删除字符串头尾字符函数

  接下来演示这三个函数的用法,如例4-12所示。

  例4-12

  1 str1, str2, str3 = "\t千锋教育\t", "***扣丁学堂***", "goodprogrammer"
  2 print(str1.strip())
  3 print(str2.strip('*'))
  4 print(str3.strip('good'))
  5 print(str3.strip('odg'))
  6 print(str2.lstrip('*'))
  7 print(str2.rstrip('*'))

  运行结果如图4.13所示。

  图4.13 运行结果

  在例4-12中,第4行与第5行输出的结果相同,说明在指定删除字符时,字符的顺序并不重要,只需保证包含的字符相同,便可得到想要的结果。

  4.5.7 检测子串

  在处理字符串时,有时需要检测某个字符串中是否包含子字符串,这时可以使用find()函数,其语法格式如下:

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

  该函数检测str是否包含在检测字符串中。如果指定范围beg和end,则检查是否包含在指定范围内。如果包含,则返回开始的下标值,否则返回-1。

  接下来演示该函数的用法,如例4-13所示。

  例4-13

  1 str = "遇到IT技术难题,就上扣丁学堂"
  2 print(str.find("IT"))
  3 print(str.find("Python"))
  4 print(str.find("扣丁学堂", 10))
  5 print(str.find("扣丁学堂", 10, 14))
  运行结果如图4.14所示。
 

  图4.14 运行结果

  在例4-13中,第2行在字符串str中查找是否包含IT,结果返回IT在字符串中的下标。第3行在字符串str中查找是否包含Python,结果返回-1,说明不包含。第4行指定查找范围从下标为10的字符开始到字符串结尾(包含最后一个字符)。第5行指定查找范围从下标为10的字符开始到下标为14的前一个字符结束。

  除此之外,还可以通过index()函数检测字串,其语法格式如下:

  index(str, beg=0, end=len(string))

  该函数的用法与find()函数类似,两者的区别:如果str不在字符串中,index()函数会报一个异常。

  接下来演示其用法,如例4-14所示。

  例4-14

  1 str = "遇到IT技术难题,就上扣丁学堂"
  2 print(str.index("扣丁学堂", 10))
  3 print(str.index("扣丁学堂", 10, 14))

  运行结果如图4.15所示。

  图4.15 运行结果

  在例4-14中,第3行在字符串str中没有检测到“扣丁学堂”,此时会抛出一个异常,如上图中显示“ValueError: substring not found”。

  4.5.8 替换子串

  在文字处理软件中,都会有查找并替换的功能。在字符串中,可以通过replace()函数来实现,其语法格式如下:

  replace(old, new [, max])

  该函数将字符串中old替换成new并返回新生成的字符串。如果指定第三个参数max,则表示替换不超过max次。

  接下来演示该函数的用法,如例4-15所示。

  例4-15

  1 str = "Anything I do, I spend a lot of time."
  2 print(str.replace('I', 'you'))
  3 print(str.replace('I', 'you', 1))

  运行结果如图4.16所示。

  图4.16 运行结果

  在例4-15中,第2行将字符串str中所有的字符'I'替换为'you',第3行将字符串str中字符'I'只替换一次为'you'。

  4.5.9 统计子串个数

  在文字处理软件中,都会有统计某个词语出现次数的功能。在字符串中,可以通过count()函数来实现,其语法格式如下:

  count(str, beg = 0, end = len(string))

  该函数返回str在字符串中出现的次数。如果指定beg或end,则返回指定范围内str出现的次数。

  接下来演示该函数的用法,如例4-16所示。

  例4-16

  1 str = "Anything I do, I spend a lot of time."

  2 print(str.count('I'))

  3 print(str.count('I', 0, 10))

  运行结果如图4.17所示。

  图4.17 运行结果

  在例4-16中,第2行统计字符串str中字符'I'出现的次数,第3行统计在下标为0到下标为10的前一位之间字符中'I'出现的次数。

  4.5.10 首字母大写

  capitalize()函数用于将字符串的第一个字母变成大写,其他字母变成小写,其语法格式如下:

  capitalize()

  接下来演示该函数的用法,如例4-17所示。

  例4-17

  1 str = "codingke is a great Website."

  2 print(str.capitalize())

  运行结果如图4.18所示。

  图4.18 运行结果

  从运行结果可看出,输出的字符串首字母变成大写并且其他字母变成小写。

  4.5.11 标题化

  title函数可以将字符串中所有单词首字母大写,其他字母小写,从而形成标题,其语法格式如下:

  title()

  接下来演示该函数的用法,如例4-18所示。

  例4-18

  1 str = "qianFeng education"

  2 print(str.title())

  运行结果如图4.19所示。

  图4.19 运行结果

  从运行结果可看出,输出的字符串中每个单词首字母变成大写并且其他字母变成小写。

  4.6 小案例

  在注册网站时,用户经常需要设置密码,然后程序根据用户输入的密码判断安全级别,具体如下所示:

  l 低级密码:

  包含单纯的数字或字母

  长度小于等于8

  l 中级密码:

  必须包含数字、字母或特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)中任意两种

  长度大于8

  l 高级密码:

  必须包含数字、字母及特殊字符(仅限:~!@#$%^&*()_=-/,.?<>;:[]{}|\)三种

  长度大于16

  接下来按照上述要求编写程序,如例4-19所示。

  例4-19

  1 # 字符分类,number保存数字字符,letter保存字母字符,symbols保存其他字符
  2 number = '0123456789'
  3 letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  4 symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
  5 # 输入密码
  6 pwd = input('请输入密码:')
  7 # 判断长度
  8 length = len(pwd)
  9 # 如果输入的密码为空或空格,重新输入
  10 while (pwd.isspace() or length == 0) :
  11 pwd = input("您输入的密码为空(或空格),请重新输入:")
  12 # 判断长度等级
  13 if length <= 8:
  14 lenGrade = 1
  15 elif 8 < length < 16:
  16 lenGrade = 2
  17 else:
  18 lenGrade = 3
  19 # 标记字符等级
  20 charGrade = 0
  21 # 判断是否包含数字
  22 for each in pwd:
  23 if each in number:
  24 charGrade += 1
  25 break
  26 # 判断是否包含字母
  27 for each in pwd:
  28 if each in letter:
  29 charGrade += 1
  30 break
  31 # 判断是否包含特殊字符
  32 for each in pwd:
  33 if each in symbols:
  34 charGrade += 1
  35 break
  36 # 判断并打印结果
  37 if lenGrade == 1 or charGrade == 1 :
  38 print("您的密码安全级别为:低")
  39 elif lenGrade == 2 or charGrade == 2 :
  40 print("您的密码安全级别为:中")
  41 else :
  42 print("您的密码安全级别为:高")

  运行结果如图4.20所示。

  图4.20 运行结果

  在例4-19中,第2~4行定义了3个变量,分别储存了数字、字母、其他字符;第13~18行判断用户输入的字符长度并进行等级划分;第22~35行判断用户输入的是否包含其数字、字母、其他字符并进行等级划分;第37-42行判断安全等级并输出结果。从图4.20中可看到输入的包含数字、字母及其他字符且长度大于16,因此密码安全级别为高。

  4.7 本章小结

  本章主要介绍了Python中的字符串,首先讲解字符串有三种表示方法及字符串中的转义字符,接着讲解字符串的输入与输出以便程序更好的交互,再讲解字符串的索引与分片,最后讲解字符串的运算及常用函数。通过本章的学习,大家需熟练使用字符串的分片及常用函数。

  4.8 习题

  1.填空题

  (1) 转义字符以 开头。

  (2) 对字符串进行输出可以使用 函数。

  (3) 对字符串进行输入可以使用 函数。

  (4) 删除字符串头尾指定字符的函数是 。

  (5) 运算符可以将两个字符串连接起来。

  2.选择题

  (1) 下列不属于字符串的是( )。

  A.qianfeng B.'qianfeng'

  C."qianfeng" D."""qianfeng"""

  (2) 使用( )符号对字符串类型的数据进行格式化。

  A.%d B.%f

  C.%e D.%s

  (3) 下列函数可以返回某个子串在字符串中出现次数的是( )。

  A.index() B.count()

  C.find() D.replace()

  (4) 若函数find()没有在字符串中找到子串,则返回( )。

  A.原字符串 B.一个异常

  C.0 D.-1

  (5) 若str = "qianfeng",则print(str[3:7])输出( )。

  A.nfen B.nfeng

  C.anfen D.anfeng

  3.思考题

  (1) 简述字符串的三种表现形式。

  (2) 简述字符串的分片。

  4.编程题

  输入一个字符串,分别统计出其中字母、数字和其他字符的个数。

上一篇:HTML5工具初识之网页编辑器

下一篇:认识HTML

QQ技术交流群

千锋Python官方①群
790693323

加入群聊