python3:字符串常用操作

# python3:符串常用操作

s1 = '字符串s1:信息。'
s2 = '字符串s2'
s3 = 1234


# 拼接字符串+
print('s1=',s1,'\ns2=',s2,'\ns3=',s3)
print('拼接字符串(同类型)s1+s2:',s1+s2)
print('拼接字符串(不同类型)s1+s2+str(s3):',s1+s2+str(s3)) #整数型的内容,需要str()转换为字符串后再同其他字符串进行拼接


#字符串长度len()
print('len(s1):',len(s1))                  #字符串中字符的个数
print('len(s1.encode()):',len(s1.encode()))         #utf-8编码的字符串长度。1个汉字或中文标点:3个字节
print('len(s1.encode("gbk")):',len(s1.encode("gbk")))    #gbk编码的字符串长度。1个汉字或中文标点:2个字节
print('len(s1.encode("gb2312")):',len(s1.encode("gb2312"))) #gb2312编码的字符串长度。1个汉字或中文标点:2个字节


#截取字符串string[start:end:step]
print('s1[:]:',s1[:])                    #不填写,默认从0到最后一个字符,step为1
print('s1[:5]:',s1[:5])                  #从下标0到下标4,不包括下标5
print('s1[1:5]:',s1[1:5])                #从下标1到下标4,不包括下标5
print('s1[1:7:2]',s1[1:7:2])             #从下标1到下标7,不包括下标7,每2个

#截取的时候,如果索引不存在就会报错,所以可以使用try……except
try:
    print('s1[40]:',s1[40])
except IndexError:
    print("Oh,Maya,索引不存在哈~")

#截取样例
idcard = '110120199101010002'
print('生日为:',idcard[6:10],'年',idcard[10:12],'月',idcard[12:14],'日') #生日为: 1991 年 01 月 01 日
print('生日为:',idcard[6:10]+'年'+idcard[10:12]+'月'+idcard[12:14]+'日') #生日为: 1991年01月01日


#分割字符串str.split(sep,maxsplit)
'''
sep     :默认为NONE,即所有的空字符(空格、换行'\n',制表符'\t'等)
maxsplit:可选参数,指定分割次数,返回结果列表的的元素个数=maxsplit+1;不指定或者为-1,则分割次数没有限制。
分割字符串把字符串分割为列表,而合并字符串是把列表合并为字符串。
'''

#样例,输出好友名称
friends = '@小高 @小王 @小姜'
friends1 = friends.split()
print(friends)
print('friends1 = friends.split()结果:',friends1)         #['@小高', '@小王', '@小姜']
for friend in friends1:
    print('friends1 元素每个去掉@后:',friend[1:])   #去掉@输出

#样例,输出好友名称2
friends2 = '>@小高>小@王>>@小姜'
print(friends2.split('>')) #['', '@小高', '@小王', '', '@小姜']   注:当一个分隔符出现多个,就会每个分隔一次,没有得到内容的,则产生一个空元素。


#合并字符串 snew=string.join(interable)
'''
snew=string.join(interable),将多个字符串采用固定的分隔符连接在一起。
string   :合并时的分隔符
interable:合并的对象,该对象中所有元素(字符串表示)将被合并为一个新的字符串。
'''
print('friends1:',friends1)
print("'&'.join(friends1):",'&'.join(friends1))  #@小高&@小王&@小姜


#检索字符串 count()方法
'''
str.count(sub,start,end)
str:原字符串
sub:要检索的字符串
start、end:检索的范围,可选参数
'''
dx = '@小高吗 @小王 @小姜 @小尾巴呀'
print('dx:',dx,'\ndx中含有@个数:',dx.count('@'))
print('dx下标2~6中含有@个数:',dx.count('@',2,6))

#检索字符串 find()方法:从左边开始查找,rfind():从右边开始查找。
'''
str.find(sub,start,end)
str:原字符串
sub:要检索的字符串
start、end:检索的范围,可选参数
'''
print('dx中首次出现@的索引:',dx.find('@'))               #dx中首次出现@的索引: 0
print('dx下标2~6中首次出现@的索引:',dx.find('@',2,6))     #dx下标2~6中首次出现@的索引: 4
print('dx中首次出现*的索引(-1为不存在):',dx.find('*'))   #dx中首次出现*的索引: -1 即不存在d
print('dx中从右侧首次出现@的索引:',dx.rfind('@'))         #dx中从右侧首次出现@的索引: 13

#检索字符串 in
print('dx中有@:','@' in dx)                             #dx中有@: True


#检索字符串index()方法,当指定字符串不存在时,会抛出异常
'''
str.index(sub,start,end)
str       :原字符串
sub       :要检索的字符串
start、end:检索的范围,可选参数
'''
print('dx中首次出现@的索引(index方法):',dx.index('@'))            #dx中首次出现@的索引: 0
print('dx下标2~6中首次出现@的索引(index方法):',dx.index('@',2,6))  #dx下标2~6中首次出现@的索引: 4
#print('dx中首次出现*的索引:',dx.index('*'))                       #不存在会抛出异常:ValueError: substring not found


#检索字符串startswith()方法
'''
str.startswith(sub,start,end)
str       :原字符串
sub       :要检索的字符串
start、end:检索的范围,可选参数
'''
print('dx中开头为@:',dx.startswith('@'))   # True
print('dx下标5~8开头为@:',dx.startswith('@',5,8)) # True

#检索字符串endswith()方法
'''
str.endswith(sub,start,end)
str       :原字符串
sub       :要检索的字符串
start、end:检索的范围,可选参数
'''
print('dx中结尾为“呀”:',dx.endswith('呀'))   # True
print('dx下标1~3结尾为“吗”:',dx.endswith('吗',1,3))   # False 注:end是不含在内的
print('dx下标1~3结尾为“高”:',dx.endswith('高',1,3))   # True

#大小写
words = 'AbcdEf'
print('AbcdEf的小写们:',words.lower())
print('AbcdEf的大写们:',words.upper())


#去除字符串中的空格和特殊字符
'''
strip()函数:去除左右两边空格和特殊字符
lstrip()函数:去除左边空格和特殊字符
rstrip()函数:去除右边空格和特殊字符
'''
a = ' @ 12 123\t4 5 @ '
print('a:'+a+'。')                    #a: @ 12 123    4 5 @ 。
print('a.strip():'+a.strip()+'。')   #默认去掉左右两侧空的内容 a.strip():@ 12 123    4 5 @。
print('a.lstrip():'+a.lstrip()+'。')  #默认去掉左侧空的内容   a.lstrip():@ 12 123    4 5 @ 。
print('a.rstrip():'+a.rstrip()+'。')  #默认去掉右侧空的内容   a.rstrip(): @ 12 123    4 5 @。

a1 = '@12123@'
print('a1:'+a1+'。')
#print('a1.strip('@'):'+a1.strip('@')+'。')   #去掉@的内容 注:引号中的和引号中的引号不要一样,不然会报错,他们会不知道谁是谁的另一半
print("a1.strip('@'):"+a1.strip('@')+'。')    #去掉@的内容    a1.strip('@'):12123。
print("a1.rstrip('@'):"+a1.rstrip('@')+'。')  #去掉@的内容    a1.rstrip('@'):@12123。


#格式化字符串 %[-][+][0][m][.n]格式化字符%exp
'''
%+ :右对齐,正数前+,负数前-
%- :左对齐,正数前无,负数前-
%0 :左对齐,正数前无,负数前-,一般与m一起使用
%m :占有宽度,如占6位,%6 结果:000001
%.n:小数点后保留的位数
格式化字符:指定的类型,如:
    %s:字符串(str()显示);
    %d:正数;
    %r:字符串(repr()显示);
    %f:浮点数
    %%:%
'''
print('数字 %08d:\t字符串:%s' %(7,'啦啦啦啦啦'))   #数字 00000007:    字符串:啦啦啦啦啦
print('数字 %+.2f:\t字符串:%s' %(7,'呀呀呀呀呀'))  #数字 +7.00:    字符串:呀呀呀呀呀

#字符串格式化:.format()方法
'''<模板字符串>.format(<逗号分隔的参数>)
调用format()方法后会返回一个新的字符串,参数从0开始编号。
常用参数如下:
    {index:}:index:指定要设置格式的对象,在后面()中的参数的索引位置,索引从0开始,为空则按顺序自动匹配,参数是否指定索引要一致,不可部分自动,部分手动,如:{:d}和{1:s}的模板是错误的。
    {:fillword}:fillword:填充空白处的字符,如:{:0},指用0填充空白处。
    {:<}:内容左对齐
    {:>}:内容右对齐
    {:=}:内容右对齐,填充内容放在左边,仅对数字有效。如{:0=} ,内容右对齐,左边用0填充
    {:∧}:内容居中,配合width使用。
    {:+}:正数前+,负数前-
    {:-}:正数前无,负数前-
    {: }:正数前 ,负数前-(空格)
    {:#}:各二进制、八进制和十六进制,显示出对应的结果:0b,0o,0x,如{:#x},转为十六进制的结果,并标记0x
    {:width}:指定所占的宽度,如:{:0=4}:内容共4位,右对齐,左边用0填充
    {:n}:指定保留的小数位数
    {:type}:指定类型,如常用:{:s}字符串,{:f}浮点数,{:d}十进制整数,{:b}二进制整数,{:o}八进制整数,{:x}十六进制整数。
'''


ts1 = 7
ts2 = '我的幸运数字是七'
ts3 = 79.768
moban2 = '编号:{:0=4d} \t自我介绍一下:{:s}\t这次考试分数{:=.2f}'
print('moban2:',moban2.format(ts1,ts2,ts3))  #moban2: 编号:0007     自我介绍一下:我的幸运数字是七    这次考试分数79.77
'''
注:一个模板中,如果出现多个占位符,其中一个需要手动指定参数的索引,那么所有的占位符均需手动指定参数索引,否则报错:
ValueError: cannot switch from automatic field numbering to manual field specification
moban2应写如下:
'''
moban3 = '编号:{0:0>4d} \t自我介绍一下:{1:s}\t这次考试分数{2:=.2f}'
print('moban3:',moban3.format(ts1,ts2,ts3))  #moban3: 编号:0007     自我介绍一下:我的幸运数字是七    这次考试分数79.77


'''
注意:
moban1 = "测试:{1:s}"
print(moban1.format('我的幸运数字是七')) 
maya埋的坑~~~ 我以为所谓下标是指字符串的位置没想到是指引用的对象在参数列表中的位置……
参数列表中,参数列表中,参数列表中……【重要的事情说N遍!】
错误提示如下:
IndexError: tuple index out of range
正确写法如下:
'''
moban1 = "测试:{1:s}"
print(moban1.format('我的幸运数字是七','啥?哈哈,原来如此'))   #测试:啥?哈哈,原来如此

#format()拓展
print('数字7的转换:{1:0=4d}'.format('文字',7,'abc'))              #数字7的转换:0007
print('列表中的数字7的转换:{0[1]:0=4d}'.format(['文字',7,'abc']))  #列表中的数字7的转换:0007  参数为列表时,使用0[0],0[1],0[2]等标记参数位置。
print('元组中的数字7的转换:{0[1]:0=4d}'.format(('文字',7,'abc')))  #元组中的数字7的转换:0007  参数为元组时,使用0[0],0[1],0[2]等标记参数位置。
print('数字7的转换<左对齐+:{1:0<+4d}'.format('文字',7,'abc'))      #数字7的转换<左对齐+:+700
print('数字7的转换>左对齐+:{1:0>+4d}'.format('文字',7,'abc'))      #数字7的转换>左对齐+:00+7
print('数字-7的转换>左对齐-:{1:0>-4d}'.format('文字',-7,'abc'))    #数字-7的转换>左对齐-:00-7
print('数字7的转换>左对齐 :{1:0> 4d}'.format('文字',7,'abc'))      #数字7的转换>左对齐 :00 7
print('数字7居中:{:0^5d}'.format(7))                             #数字7居中:00700
print('数字7小数显示:{:.2f}'.format(7))                           #数字7小数显示:7.00
print('数字7浮点数显示:{:f}'.format(7))                           #数字7浮点数显示:7.000000
print('数字777777金额显示:{:,.4f}'.format(777777))                #数字777777金额显示:777,777.0000
print('数字7百分比显示:{:%}'.format(7))                           #数字7百分比显示:700.000000%
print('数字-7居中:{:0^5d}'.format(-7))                           #数字-7居中:0-700
print('数字-7居右:{:0=5d}'.format(-7))                           #数字-7居右:-0007
print('数字-7二进制:{:#b}'.format(-7))                           #数字-7二进制:-0b111
print('数字-7二进制:{:b}'.format(-7))                            #数字-7二进制:-111
print('数字77八进制:{:o}'.format(77))                            #数字77八进制:115
print('数字77八进制:{:#o}'.format(77))                           #数字77八进制:0o115
print('数字77十六进制:{:x}'.format(77))                          #数字77十六进制:4d
print('数字77十六进制:{:#x}'.format(77))                         #数字77十六进制:0x4d
print('数字77科学计数法:{:e}'.format(77))                        #数字77十六进制:4d
print('数字0.01百分比(无小数):{:.0%}'.format(0.01))             #数字0.01百分比(无小数):1%

#字符串编码转换encode()转码
bianma = '姜小八'
bianma1 = bianma.encode(encoding='utf-8',errors='strict')
bianma2 = bianma.encode('gbk')
print(bianma,'转为utf-8编码:',bianma1)                                        #姜小八 转为utf-8编码: b'\xe5\xa7\x9c\xe5\xb0\x8f\xe5\x85\xab'
print(bianma,'转为gbk编码:',bianma2)                                          #姜小八 转为gbk编码: b'\xbd\xaa\xd0\xa1\xb0\xcb'
#字符串编码转换decode()方法解码
print(bianma1,'utf-8解码:',bianma1.decode(encoding='utf-8',errors='strict'))  #b'\xe5\xa7\x9c\xe5\xb0\x8f\xe5\x85\xab' 解码: 姜小八
print(bianma2,'GBK解码:',bianma2.decode('GBK'))                               #b'\xbd\xaa\xd0\xa1\xb0\xcb' 解码: 姜小八

结果:

C:\Users\yunniao\PycharmProjects\untitled1\venv\Scripts\python.exe D:/soft/Test/python-script/1030-zifuchuan.py

s1= 字符串s1:信息。

s2= 字符串s2

s3= 1234

拼接字符串(同类型)s1+s2: 字符串s1:信息。字符串s2

拼接字符串(不同类型)s1+s2+str(s3): 字符串s1:信息。字符串s21234

len(s1): 9

len(s1.encode()): 21

len(s1.encode("gbk")): 15

len(s1.encode("gb2312")): 15

s1[:]: 字符串s1:信息。

s1[:5]: 字符串s1

s1[1:5]: 符串s1

s1[1:7:2] 符s:

Oh,Maya,索引不存在哈~

生日为: 1991 年 01 月 01 日

生日为: 1991年01月01日

@小高 @小王 @小姜

friends1 = friends.split()结果: ['@小高', '@小王', '@小姜']

friends1 元素每个去掉@后: 小高

friends1 元素每个去掉@后: 小王

friends1 元素每个去掉@后: 小姜

['', '@小高', '小@王', '', '@小姜']

friends1: ['@小高', '@小王', '@小姜']

'&'.join(friends1): @小高&@小王&@小姜

dx: @小高吗 @小王 @小姜 @小尾巴呀

dx中含有@个数: 4

dx下标2~6中含有@个数: 1

dx中首次出现@的索引: 0

dx下标2~6中首次出现@的索引: 5

dx中首次出现*的索引(-1为不存在): -1

dx中从右侧首次出现@的索引: 13

dx中有@: True

dx中首次出现@的索引(index方法): 0

dx下标2~6中首次出现@的索引(index方法): 5

dx中开头为@: True

dx下标5~8开头为@: True

dx中结尾为“呀”: True

dx下标1~3结尾为“吗”: False

dx下标1~3结尾为“高”: True

AbcdEf的小写们: abcdef

AbcdEf的大写们: ABCDEF

a: @ 12 123 4 5 @ 。

a.strip():@ 12 123 4 5 @。

a.lstrip():@ 12 123 4 5 @ 。

a.rstrip(): @ 12 123 4 5 @。

a1:@12123@。

a1.strip('@'):12123。

a1.rstrip('@'):@12123。

数字 00000007: 字符串:啦啦啦啦啦

数字 +7.00: 字符串:呀呀呀呀呀

moban2: 编号:0007 自我介绍一下:我的幸运数字是七 这次考试分数79.77

moban3: 编号:0007 自我介绍一下:我的幸运数字是七 这次考试分数79.77

测试:啥?哈哈,原来如此

数字7的转换:0007

列表中的数字7的转换:0007

元组中的数字7的转换:0007

数字7的转换<左对齐+:+700

数字7的转换>左对齐+:00+7

数字-7的转换>左对齐-:00-7

数字7的转换>左对齐 :00 7

数字7居中:00700

数字7小数显示:7.00

数字7浮点数显示:7.000000

数字777777金额显示:777,777.0000

数字7百分比显示:700.000000%

数字-7居中:0-700

数字-7居右:-0007

数字-7二进制:-0b111

数字-7二进制:-111

数字77八进制:115

数字77八进制:0o115

数字77十六进制:4d

数字77十六进制:0x4d

数字77科学计数法:7.700000e+01

数字0.01百分比(无小数):1%

姜小八 转为utf-8编码: b'\xe5\xa7\x9c\xe5\xb0\x8f\xe5\x85\xab'

姜小八 转为gbk编码: b'\xbd\xaa\xd0\xa1\xb0\xcb'

b'\xe5\xa7\x9c\xe5\xb0\x8f\xe5\x85\xab' utf-8解码: 姜小八

b'\xbd\xaa\xd0\xa1\xb0\xcb' GBK解码: 姜小八

Process finished with exit code 0