python字符串相关操作和方法详解

一、字符串基础

1.什么是字符串(str)

格式:元素1元素2元素3...
字符串是容器型数据类型,将 单引号 作为容器的标志,元素不需要用逗号隔开
字符串是 不可变的(不支持增删改) ,字符串是 有序的(支持下标操作)
字符串的元素:只能是 本文符号(所有在计算机能够表达出来的符号都是文本符号)
字符串中每一个独立的元素又叫:字符;在python中只有字符的概念,但没有字符对应的数据类型
空串

str1 = ''
str2 = ""
str3 = ''''''
str4 = """"""

非空字符串

str11 = 'abc'
str22 = "你好"

2.字符(字符串中的元素)

字符串中的字符分两种:普通字符、转义字符

1)普通字符

除了转义字符以外的字符

2)转义字符

在指定符号前加‘\’用来表示一些特殊功能和特殊意义的字符
\n - 换行
\t - 制表符(tab键)
' - 单引号
" - 双引号
\ \ - 反斜杠

    编码字符

\u + 4位的十六进制

str5 = '\uaa3c\u2342\u4e00'
print(str5,len(str5)) # ꨼⍂一 3

3)阻止转义

在字符串的最开始的引号前面加R / r,那么字符串中的所有的转义字符都有效

str6 = r'\tabc\n234\u4e00'
print(str6) # \tabc\n234\u4e00

应用:windows路径,正则表达式语法

二、字符串编码

1.什么是字符编码

计算机在存储数据的时候只能存数字,而且存的是 数字的补码
为了能够让计算机存储文本数据,给每个字符关联了一个固定的数字,用来对这个字符进行存储
每个字符关联的那个数字就是这个字符的 编码值

2.编码表

1)ASCII码表

用一个字节来保存字符的编码值(0 ~ 127)

2)Unicode编码表

Unicode编码表是对ASCII表的扩展(Unicode编码表中包含了ASCII表中所有的符号)
Unicode编码表中包含了世界上所有国家所有民族所有的语言的符号,总共65536个
中文范围:0x4e00 - 0x9fa5

1)chr函数

chr(编码值) - 获取指定编码值对应的字符

print(chr(0x0f00)) # ༀ
# 获取所有的中文字符
for x in range(0x4e00,0x9fa5):
    print(chr(x),end=',')
2)ord函数

ord(字符) - 获取指定字符对应的编码值

print(ord('杨')) # 26472

三、字符串相关操作

1.获取字符串中的元素(获取字符)

字符串获取元素和列表获取元素的语法一样

str1 = 'how are you'

1)获取单个元素

print(str1[1],str1[-1]) # o u

2)切片

print(str1[1:5]) # ow a
print(str1[-3::-1]) # y era woh

3)遍历

for x in str1:
    print(x)

2. +, *

字符串1 + 字符串2
字符串 * N 或者 N * 字符串

str1 = 'abc'
str2 = '123'
print(str1 + str2) # abc123
print(str1 * 2)  # abcabc

3.==,!=

print(str1 == str2) # False

4.>, <, >=, <= (针对两个字符串)

两个字符串比较大小:比较的是第一组不相等的字符的编码值的大小

str3 = 'ABC'
str4 = 'abcd'
print(str3 < str4) # True

应用:
        判断是否是数字字符:'0' <= char <= '9'
        判断是否是小写字母:'a' <= char <= 'z'
        判断是否是大写字母:'A' <= char <= 'Z'
        判断是否是字母:'a' <= char <= 'z' or 'A' <= char <= 'Z'
练习1:输入一个字符串,统计字符串字母和中文的个数

str5 = 'hello,你好吗?'
cou = 0
count = 0
for x in str5:
    if 'a' <= x <= 'z' or 'A' <= x <= 'Z':
        cou += 1
    elif 0x4e00 <= ord(x) <= 0x9fa5:
        count += 1
print(cou,count)

练习2:判断输入的字符是否是纯数字字符串

str6 = '234wer'
for x in str6:
    if '0' <= x <= '9':
        continue
    else:
        print('不是纯字符串')
        break
else:
    print('纯字符串')

5.in 和 not in

字符串1 in 字符串2 - 判断字符串1是否是字符串2的子串

print('abc' in 'abcmn') # True

6.相关函数

max / min / sorted / reversed等,这些函数都适用于字符串
len - 求字符串长度
str - 将自定数据转换成字符串类型
      a.所有的数据都能转换成字符串
      b.将数据的打印值作为字符串的内容

四、字符串相关方法

1.center/rjust/ljust/zfill

字符串.center(长度,填充字符)
产生一个新的字符串,长度是指定长度,原字符串在新字符串中间,左右用指定字符串填充
字符串.rjust(长度,填充字符)
产生一个新的字符串,长度是指定长度,原字符串在新字符串最右边,左边用指定字符串填充
字符串.zfill(长度) == 字符串.rjust(长度,'0')
字符串.ljust(长度,填充字符)
产生一个新的字符串,长度是指定长度,原字符串在新字符串最左边,右边用指定字符串填充

str1 = 'abc'
new_str = str1.center(7,'0')
print(new_str) # 00abc00
new_str = str1.rjust(7,'*')
print(new_str) # ****abc

练习:给任意一个商品的数字编号值,转换成固定格式的商品编码:GDXXXX -> GD0001

num = 34
print('GD' + str(num).zfill(4)) # GD0034

2.replace

字符串1.replace(字符串2,字符串3) - 将字符串1中所有的字符串2替换成字符串3
字符串1.replace(字符串2,字符串3, N) - 将字符串1中前N个字符串2替换成字符串3

str1 = 'lksdjflksdjdoifwjo'
new_str = str1.replace('ksd', 'abc')
print(new_str) # labcjflabcjdoifwjo
print(str1.replace('ksd', 'abc', 1)) # labcjflksdjdoifwjo

3.计算次数

字符串1.count(字符串2) - 统计字符串1中字符串2出现的次数
字符串1.count(字符串2,开始下标 = 0,结束下标 = 字符串长度)- 在字符串1中指定范围内统计字符串2出现的次数

4.切割字符串

字符串1.split(字符串2) - 将字符串1按照字符串2为切割点进行切割
字符串1.split(字符串2,N) - 将字符串1按照字符串2为切割点进行切割,切N次
字符串1.rsplit(字符串2,N) - 将字符串1按照字符串2为切割点进行切割,切N次,从后往前切

str1 = 'how are you? i am fine, and you'
print(str1.split(' ')) # ['how', 'are', 'you?', 'i', 'am', 'fine,', 'and', 'you']
print(str1.split(' ', 2))  # ['how', 'are', 'you? i am fine, and you']
print(str1.rsplit(' ', 2)) # ['how are you? i am fine,', 'and', 'you']

5.修改大小写

字符串1.capitalize()
字符串1.title()
字符串1.lower()
字符串1.upper()

6.删除字符

此方法不能删除中间的空白
字符串1.strip() - 同时删除字符串中最左边和最右边的所有空白(包括换行,缩进,空格)
字符串1.lstrip() - 删除字符串中最左边的所有空白(包括换行,缩进,空格)
字符串1.rstrip() - 删除字符串中最右边的所有空白(包括换行,缩进,空格)

字符串1.strip(字符串2) - 同时删除字符串中最左边和最右边的所有字符串2
字符串1.lstrip(字符串2) - 删除字符串中最左边的所有字符串2
字符串1.rstrip(字符串2) - 删除字符串中最右边的所有字符串2

7.查找字符串内容

字符串1.find(字符串2) - 获取字符串2第一次在字符串1中出现的位置(用正的下标值表示,如果找不到返回-1)
字符串1.find(字符串2,开始下标,结束下标) - 获取字符串2在字符串1中开始下标到结束下标内第一次在字符串1中出现的位置

str1 = 'how are you? Im fine, Thank you! And you'
for i in range(0, len(str1)):
    if str1[i: i + len('you')] == 'you':
        print(str1.find('you', i, len(str1)))

8.拼接

字符串.join(容器) - 将容器中元素用指定字符串连接在一起,容器中的元素要求是字符串

list1 = ['小明','小红','小黑']
new_str = ' and '.join(list1)
print(new_str)
new_str2 = '+'.join('abc')
print(new_str2)
# 练习2:将任意容器中的元素使用join进行连接
nums = [10, 20, 30]
nums1 = {'name':'小明','age':18,'sex':'男'}
new_str3 = ''.join(str(x) for x in nums)
new_str4 = ','.join(str(x) for x in nums1)
new_str5 = ','.join(str(x) for x in nums1.values())
print(new_str3)
print(new_str4)
print(new_str5)

注意 :以上方法为常用方法,其他更多的方法详见菜鸟教程~

五、格式字符串

字符串中某一个或者多个部分不确定就可以用格式字符串来实现功能
正常写法

name = '张三'
age = 23
message = name + '今年'+ str(age) +'岁!'
print(message) # wer今年32岁!

1.格式占位符

语法:
包含格式占位符的字符串 % (数据1,数据2,数据3,...)
说明:
a.数据的个数和前面占位符的个数保持一致
b.格式占位符:
    %d - 整数;
    %Nd - 整数填充字符串的时候宽度是N,不够用空格在前面/后面占位;
    %f - 小数;
    %.Nf - .N表示保留N位小数
    %s - 字符串
注意:一般情况下占位符和数据类型需要保持一致,只有%s可以用任何类型的数填充

message = '%s今年%-5d岁!' % (name, age)
print(message) # wer今年32   岁!

2.format

在字符串中通过{}来占位表示字符串中变化的部分

1)数据的个数和{}的个数保持一致

message = '{}今年{}岁!'.format(name,age)
print(message) # wer今年32岁!

2)列表形式的format:{下标}

# ‘你好我是XXX。XXX你好’
message = '你好我是{0}。{0}你好'.format(name)
print(message) # 张三今年18岁,分数89

3)key形式的format:{key}

str3 = '{name}今年{age}岁,分数{score}'.format(name='张三',age=18,score=89)
print(str3) # 张三今年18岁,分数89

4)key形式format的变形:

f'字符串{变量名}'

a = 10
b = 20
message = f'a={a},b={b}'
print(message) # a=10,b=20

5)数字格式化

:.Nf - 限制小数的小数点位数(N位)
:x>Nf - 数字占N位,不够用X填充
:, - 用逗号将数据进行分割(通用于银行数据显示)
:.N% - 用百分比的数据显示数据,数据保留N位小数

print('数字:{:.2f}'.format(3.1415926)) # 数字:3.14
print('数字:{1:.2f}'.format(3.1415926,1.12334)) # 数字:1.12
print('数字:{n1:.2f}'.format(n1=3.1415926,n2=1.12334)) # 数字:3.14

print('{:0>5d}'.format(34)) # 00034
print(f'{34:a<5d}') # 34aaa
print(f'{34: >5d}') #    34

num = 120230203000023000
print(f'{num:,}')

num = 0.45
print(f'{num:.2%}')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345