Python(十)python字符串String

98 阅读8分钟

Python字符串使我们最常用的数据类型。

以使用引号( ' 或 " )来创建字符串。

 

一:创建字符串并访问他的值

# *定义字符串
*string_one = "我是一个字符串"
print("string_one:" + string_one +",并且在打印的时候被更新了")

 

输出:

string_one:我是一个字符串,并且在打印的时候被更新了


二:python的驻留机制

aa = 'python'
bb = "python"
cc = '''python'''

print(id(aa))
print(id(bb))
print(id(cc))

 

输出:

2307494144752

2307494144752

2307494144752

 

上边的代码使用三种不同的方式去定义了三个字符串,但是这三个字符串的内存地址是相同的。说明,这个字符串在内存中只有一份。

 

python字符串是一个不可变的字符序列,这个特性和元组是一样的

 

python的驻留机制有一下几个特殊情况

驻留机制的几种情况(交互模式) 

1:字符串的长度为0或1时

s1 = ''
s2 = ''
result = s1 is s2
print(result)

输出:True

2:符合标识符的字符串(标识符是由字母(A--Z 和 a--z)、下划线和数字组成。如果标识符中出现除了这 3 类字符之外的其他字符,就肯定是不合法标识符。

s1 = 'qwe!'

s2 = 'qwe!'

print(s1 is s2)

False

s1 == s2

True

id(s1)

1714461826216

id(s2)

1714461826272

 

s1 = 'qwe'

s2 = 'qwe'

s1 is s2

True

 

3:字符串只在编译时进行驻留,而非运行时 

4:[-5,256]之间的整数数字

sys中的intern方法强制2个字符串指向同一个对象 

PyCharm对字符串进行了优化处理

 

三:python转义符

转义字符描述
(在行尾时)续行符
\反斜杠符号
'单引号
"双引号
\a响铃
\b退格(Backspace)
\000
\n换行
\v纵向制表符
\t横向制表符
\r回车
\f换页
\oyy八进制数,yy 代表的字符,例如:\o12 代表换行,其中 o 是字母,不是数字 0。
\xyy十六进制数,yy代表的字符,例如:\x0a代表换行
\other其它的字符以普通格式输出

 

 

四:python字符串运算符

下表实例变量 a 值为字符串 "Hello",b 变量值为 "Python":

操作符描述实例
+字符串连接a + b 输出结果: HelloPython
*重复输出字符串a*2 输出结果:HelloHello
[]通过索引获取字符串中字符a[1] 输出结果 e
[ : ]截取字符串中的一部分,遵循左闭右开原则,str[0:2] 是不包含第 3 个字符的。a[1:4] 输出结果 ell
in成员运算符 - 如果字符串中包含给定的字符返回 True'H' in a 输出结果 True
not in成员运算符 - 如果字符串中不包含给定的字符返回 True'M' not in a 输出结果 True
r/R原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。就是原样输出print( r'\n' )print( R'\n' )

 

例:

a = "Hello"
b = "Python"

print("a + b 输出结果:", a + b)
print("a * 2 输出结果:", a * 2)
print("a[1] 输出结果:", a[1])
print("a[1:4] 输出结果:", a[1:4])

if ("H" in a):
print("H 在变量 a 中")
else:
print("H 不在变量 a 中")

if ("M" not in a):
print("M 不在变量 a 中")
else:
print("M 在变量 a 中")

# *原样输出
*print(r'\n')
print(R'\n')

 

五:Python字符串格式化

Python的字符串还是很有意思的。

之前在使用PHP的时候,拼接字符串是一件很简单的事。

例如下边这样:

<?php

       $str = "我是一个字符串,我有" . 10 . "个字符";

       echo $str

 

但是python中的字符串拼接,相对要麻烦一点,不同数据类型的变量是不可以直接像PHP中那样直接拼接的。

需要将非字符串类型的变量转换成字符串,再进行拼接。

string_ge = "我是一个字符串,我有" + str(10) +  "个字符"
print(string_ge)

 

这样写是没有问题的。但是python为我们提供了一些字符串格式化的符号:

**** ****描述
      %c 格式化字符及其ASCII码
      %s 格式化字符串
      %d 格式化整数
      %u 格式化无符号整型
      %o 格式化无符号八进制数
      %x 格式化无符号十六进制数
      %X 格式化无符号十六进制数(大写)
      %f 格式化浮点数字,可指定小数点后的精度
      %e 用科学计数法格式化浮点数
      %E 作用同%e,用科学计数法格式化浮点数
      %g %f和%e的简写
      %G %f 和 %E 的简写
      %p 用十六进制数格式化变量的地址

 

格式化操作符辅助指令:

符号功能
*定义宽度或者小数点精度
-用做左对齐
+在正数前面显示加号( + )
在正数前面显示空格
#在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X')
0显示的数字前面填充'0'而不是默认的空格
%'%%'输出一个单一的'%'
(var)映射变量(字典参数)
m.n.m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)

 

例:

string_geshi = "我是一个字符串,我有 %d 个字符" % (10)
print(string_geshi)

 

输出:

我是一个字符串,我有 10 个字符

 

六:使用三引号实现多行字符串

python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。实例如下

string_three = """
{(我是一个多行字符串 \n 很多行 \n 很多行 \n 很多行)}
……
"""

print(string_three)

 

输出:

{(我是一个多行字符串

 很多行

 很多行

 很多行)}

……

七:字符串常用操作

1:查找字符串

查找字符串我们常用的四个函数有

Index:从左向右查找字符串第一次出现的位置,未找到报异常

Rindex:从右向左查找字符串第一次出现的位置,未找到报异常

Find:从左向右查找字符串第一次出现的位置。未找到返回-1

Rfind:从右向左查找字符串第一次出现的位置,未找到返回-1

 

str"hello hello"  
print(str.index('lo'))  
print(str.rindex('lo'))  
print(str.find('lo'))  
print(str.rfind('lo'))  
# print(str.index('xx'))  
# print(str.rindex('xx'))  
print(str.find('xx'))  
print(str.rfind('lxo'))    

 

输出:

    3

9

3

9

-1

-1

中间注释那两行print代码报异常,开发中建议使用find与rfind进行查找

 

2:字符串大小写操作

关于字符串大小写转换的操作有以下函数:

Upper:把字符串中所有字符转换为大写

Lower:把字符串中所有字符转换成小写

Swapcase:将字符串中所有小写字符转换成大写,所有大写字符转换成小写

Capitalize:将字符串的第一个字符转换为大写

Title:返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写

str"hello Hello"  
print(str.upper());  
print(str.lower());  
print(str.swapcase());  
print(str.capitalize());  
print(str.title());

输出:

HELLO HELLO

hello hello

HELLO hELLO

Hello hello

Hello Hello

 

3:字符串内容对其的操作方法

内容对其我们使用到的函数有:

Center:返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格。设置长度小于字符长度,返回原字符串

Ljust:返回一个原字符串左对齐,并使用 fillchar 填充至长度 width 的新字符串,fillchar 默认为空格。设置长度小于字符长度,返回原字符串

Rjust:返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度 width 的新字符串。设置长度小于字符长度,返回原字符串

Zfill:返回长度为 width 的字符串,原字符串右对齐,前面填充0

str"hello World"  
print(str.center(20'+'))  
print(str.ljust(20'+'))  
print(str.rjust(20'+'))  
print(str.zfill(20))

输出:

    ++++hello World+++++

hello World+++++++++

+++++++++hello World

000000000hello World

 

4:字符串的拆分

字符串拆分我们用到的函数:

split(str="", num=string.count(str)):以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串,返回值是一个列表。

rsplit(str="", num=string.count(str)):以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串,返回值是一个列表。

str"hello World"  
print(str.split(' '))  
print(str.rsplit('Wo'))    

输出:

['hello', 'World']

['hello ', 'rld']    

 

5:字符串合并

字符串合并我们使用参数:

join(seq):以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

使用join的时候需要注意一下语法:

   lists = ['hello''World']  
print("       ".join(lists)) 

输出:

   hello       World 

 

6:字符串替换操作

字符串替换我们需要用到 replace

   str"hello World"  
print(str.replace('he','123456')) 

输出:

123456llo World

 

7:字符串编码与解码

字符编码与解码我们用到的函数:

encode(encoding='UTF-8',errors='strict'):以 encoding 指定的编码格式编码字符串,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace'

   str'侯门一入深似海,从此萧郎是路人';  
# 编码  
gbk = str.encode('GBK')  
utf = str.encode('UTF-8')  
print(gbk)  
print(utf)  
# 解码  
degbk = gbk.decode('GBK')  
deutf = utf.decode('UTF-8')  
print(degbk)  
print(deutf) 

输出:

    b'\xba\xee\xc3\xc5\xd2\xbb\xc8\xeb\xc9\xee\xcb\xc6\xba\xa3\xa3\xac\xb4\xd3\xb4\xcb\xcf\xf4\xc0\xc9\xca\xc7\xc2\xb7\xc8\xcb'

b'\xe4\xbe\xaf\xe9\x97\xa8\xe4\xb8\x80\xe5\x85\xa5\xe6\xb7\xb1\xe4\xbc\xbc\xe6\xb5\xb7\xef\xbc\x8c\xe4\xbb\x8e\xe6\xad\xa4\xe8\x90\xa7\xe9\x83\x8e\xe6\x98\xaf\xe8\xb7\xaf\xe4\xba\xba'

侯门一入深似海,从此萧郎是路人

侯门一入深似海,从此萧郎是路人

有好的建议,请在下方输入你的评论。