4000字带你深入掌握字符串

原文点这里
字符串是 Python 中最常用的数据类型,几乎所有的python应用程序都会以某种方式用到字符串。今天我们就利用几分钟时间详细了解下我们经常用的这种数据类型。

字符串是什么

字符串是单个字符的序列。序列这个术语很重要,这意味着字符串是固定的,即他们的位置无法改变。字符串中可以包含数字、字母,以及一些控制字符,如换行符、制表符等。

  • 使用单引号(’)

你可以用单引号定义字符串,就如同’xiao Q’这样。所有的空白,即空格和制表符都照原样保留。

  • 使用双引号(")

在双引号中的字符串与单引号中的字符串的使用完全相同,例如"xiao Q"。

  • 使用三引号(’’'或""")

利用三引号,你可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双引号。例如:

‘’’

My name is xiao Q,

我的中文名字叫小Q,

这是一个多行字符串。

‘’’

注意上述三种字符串在语义上没有任何差别,但必须要求在字符串开始和结尾使用的引号类型必须相同。

将多个字符串常量放在一行会连接起来,如

string = "hello"'world' '!'
helloworld!

转义符

假设你想要在一个字符串中包含一个单引号(’),那么你该怎么指示这个字符串?例如,这个字符串是What’s your name?。你肯定不会用’What’s your name?'来指示它,因为Python会弄不明白这个字符串从何处开始,何处结束。所以,你需要指明字符串中间的单引号不是字符串的结尾。可以通过转义符来完成这个任务(如果只用双引号和单引号定义整个字符串,则可以相应的嵌入单引号和双引号)。

在python中使用反斜杠(’\’)来转义特殊字符,如换行符,反斜杠本身,引号等等。下面列出了一些常用的转义字符,无法识别的转义符将连同前面的反斜杠在内保持原样。

常见的转义字符

字符描述
\续行符
\\反斜杠符号
\’单引号
\"双引号
\a响铃(音箱发出声音)
\b退格
\e转义
\0
\n换行
\v纵向制表符
\t横向制表符
\r回车
\f换页

下面我们展示下转义字符在字符串中的应用。

print("xiao \
Q")   # 加入续行符
xiao Q
print("\\")  # 反斜杠,输出为\
print("xiao \t Q") #纵向制表符
xiao
	Q
print("xiao\rQ")
Q

自然字符串

如果你想要指示某些不需要如转义符那样的特别处理的字符串,即不想任何转义字符生效时,那么你需要指定一个自然字符串。自然字符串通过给字符串加上前缀r或R来指定。例如r"Newlines are indicated by \n"。

print(r"\n \a \\ \'")
\n \a \\ \'

Unicode字符串

Unicode是书写国际文本的标准方法,它为每种语言的每一个字符都设定了统一并且唯一的二进制编码。那么你需要有一个支持Unicode的编辑器。类似地,Python允许你处理Unicode文本——你只需要在字符串前加上前缀u或U 。例如,u"This is a Unicode string."。

在你处理文本文件的时候就可以使用Unicode字符串,特别是当你知道这个文件含有用非英语的语言写的文本。

字符串操作

python中可以使用“+”,“*”,”in", "not in"等运算符对字符串进行操作。

a = "xiao"
b = "Q"
c = 7
print(a + b) # 使用+连接字符串,输出为:xiaoQ。
print(b * c) # 使用*重复字符串,这里重复c=7次,输出为:QQQQQQQ
print(a + str(c)) # 注意:不同数据类型无法合并,这里c是int型,我们需要利用str()将其转成字符串型,才能够与a进行连接。
print('a' in a) # True, 判断a中是否含有字符'a'
print('c' not in a) # True, 判断a中不含有字符'c'

同时,python也提供了很多对字符串操作的函数,如下表所示(未列出全部)。

字符串操作描述
string.capitalize()将字符串的第一个字符转换为大写
string.center(width,fillchar)返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
string.count(str,beg=0,end=len(string))获得字符串中,某一子字符串出现的次数,如果beg和end指定,则返回指定范围内str出现的次数
string.endswith(obj,beg=0,end=len(string))检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束
string.find(str,beg=0,end=len(string))检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内
string.index(str,beg=0,end=len(string))跟find()方法一样,只不过如果str不在字符串中会报一个异常.
string.isalnum()如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False
string.isalpha()如果字符串至少有一个字符并且所有字符都是字母则返回 True, 否则返回 False
string.isdecimal()如果 string 只包含十进制数字则返回 True 否则返回 False.
string.isdigit()如果字符串只包含数字则返回 True 否则返回 False
string.islower()检查是否都为小写字母
string.isspace()如果字符串中只包含空白,则返回 True,否则返回 False.
string.istitle()检查字符串中的单词是否都为首字母大写
string.isupper()检查字符串是否都为大写字母
string.join()以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
string.lstrip()截掉 string 左边的空格
string.lower()转换 string 中所有大写字符为小写
string.split(str="", num=string.count(str))以 str 为分隔符切片 string,如果 num 有指定值,则仅分隔num+1个子字符串
string.swapcase()将字符串中大写转换为小写,小写转换为大写
string.title()所有单词首字母大写,其余字母小写
string.upper()转换字符串中的小写字母为大写
len(string)返回字符串长度

函数的使用如下所示:

s = "xiaoQ"
s.capitalize() # 返回为'Xiaoq'
s.center(7) # 返回为' xiaoQ '
s.count('x') # 返回为1
s.endswith('q') # 返回为False
s.find('a') # 返回为2,若str不在字符串中,则返回-1
s.index('i') # 返回为1,若str不在字符串中,会报错
s.isalnum() # 返回为True
s.isalpha() # 返回为True
s.isdecimal() # 返回为False
s.isdigit() # 返回为False
s.islower() # 返回为False

sp = " "
s.isspace() # 返回为False
sp.isspace() # 返回为True
s.istitle() # 返回False
s.isupper() # 返回False
'_'.join(s) # 返回为'x_i_a_o_Q'

sl = "  xiaoQ"
sl.lstrip() # 返回为"xiaoQ"
s.lower() # 返回为"xiaoq"
s.split('a') # 返回为['xi','oQ']
s.swapcase() # 返回为"XIAOq"

st = "my name is xiao q"
st.title() # 返回为"My Name Is Xiao Q"
st.upper() # 返回为”MY NAME IS XIAO Q“
len(st) # 返回为17

注意,以上函数并不改变字符串本身,而是返回修改后的新的字符串。如果要修改原字符串,可以使用如下所示方法,如:

s = s.title # 此时s变成"My Name Is Xiao Q"

索引和分片

前面我们也说了字符串是一个不可改变序列的列表,即一旦声明了字符串,则该字符串中每个字符都有了自己固定的位置。在python中可以使用[]来访问字符串中指定位置上的字符。同时也可以指定索引范围,称为分片。

s = "xiao Q"
s[2] # 索引字符串中序号为2的字符,也就是第3个字符,'a'
s[-1] # 从字符串尾部索引倒数第1个字符,'Q'
s[1:3] # 取字符串中第2个字符到第4个字符的内容,但不包括第4个内容,'ia'
s[1:-1] # 从第2个字符到最后1个字符,但不包含最后一个,'iao Q'
s[:-2] # 等同于[0:-2]相同,'xiao'

索引与分片string[start: end]的过程遵循以下的规则:

  • 返回的字符串包含从start起始到end但不包括end结束的所有字符,也不包含end指定的字符。
  • 若指定了start但未指定end,则一直向后分片,直至字符串结束。
  • 若指定了end但未指定start,则从0开始分片直至end,但不包含end指定的字符。
  • 若start和end均指定为负数,则索引从字符串尾部开始,而不是从首部开始。最后一个字符为-1。

格式化

由于字符串中的字符顺序是不可变的,但是在某些情况,又要根据不同需要修改字符串的内容。此时,可以使用"%"开头的字符,用以改变字符串的内容,转换符只是一个占位符,它会被后面表达式(变量、常量、数字、字符串、加减乘除等各种形式)的值代替。使用时将格式化的字符串放于运算符%左边,需内插到返回表达式的对象放置于右边。例如:

"my name is %s"% 'xiao Q' # 返回"my name is xiao Q"

常用的格式化字符如下表所示。

符号描述
%c转换成字符(ASCII 码值,或者长度为一的字符串)
%r使用 repr() 函数将表达式转换为字符串
%s使用 str() 函数将表达式转换为字符串
%d/%i转成有符号十进制数
%u转成无符号十进制数
%o转成无符号八进制数
%x/%X转成无符号十六进制数(x / X 代表转换后的十六进制字符的大小写)
%e/%E转成科学计数法(e / E控制输出e / E)
%f/%F转成浮点数(小数部分自然截断)
%g/%G%f和%e的简写
%%输出% (格式化字符串里面包括百分号,那么必须使用%%)
%p用十六进制数格式化变量的地址

通过"%“可以进行字符串格式化,但是”%"经常会结合下面的辅助符一起使用。

辅助符号描述
*定义宽度或者小数点精度
-用做左对齐
+在正数前面显示加号(+)
#在八进制数前面显示零(0),在十六进制前面显示"0x"或者"0X"(取决于用的是"x"还是"X"
0显示的数字前面填充"0"而不是默认的空格
(var)映射变量(通常用来处理字段类型的参数)
m.nm 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)
f = 3.1415926
n = 77
print("f is %.2f, n is %d "%(f,n)) # 输出为"f is 3.14, n is 77"
print("n is %10d"%n) #输出为"n is         77"

当然,python也提供了format函数进行格式化。它用{}来代替之前的%。具体使用如下所示。

name = "xiao Q"
print("my name is {}".format(name)) # 输出为"my name is xiao Q"

age = 25

print("{} is {} years old".format(name,age)) # 输出为"xiao Q is 25 years old"

print "He is {0}! {0} is {1} years old".format(name, age) # 输出为"He is xiao Q! xiao Q is 25 years old"

# 下标参数
Q1 = ["xiao Q", 25]
Q2 = ["old Q", 18]
print ("{0[0]} is {0[1]} years old,{1[0]} is {1[1]} years old".format(Q1, Q2)) 
# 输出为"xiao Q is 25 years old,old Q is 18 years old"

你也可以在字符串前面加上f用以代替format。

print(f"{name} is {age} years old") # 输出为"xiao Q is 25 years old"

总结

今天我们详细介绍了python中常用的数据类型-字符串(string),希望通过本文你能在今后的学习工作中灵活运用字符串。

更多python内容分享,请关注:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DataAssassin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值