09-字符串操作

字符串操作

1. 获取字符串长度

1. 1 len(str) : 用于指定要进行长度统计的字符串。
x = 'abcdef'
len(x)  # out: 6


1. 2 获取字符串的字节数 : len(str.encode())

在 Python 中,不同的字符所占的字节数不同,数字、英文字母、小数点、下划线以及空格,各占一个字节,而一个汉字可能占 2~4 个字节,具体占多少个,取决于采用的编码方式。

汉字在 GBK/GB2312 编码中占用 2 个字节,而在 UTF-8 编码中一般占用 3 个字节。

获取采用 UTF-8 编码的字符串的长度

str1 = "人生苦短,我用Python"  
len(str1.encode())  # out: 27

获取采用 GBK 编码的字符串的长度

str2 = "人生苦短,我用Python"  
len(str2.encode('gbk'))  # out: 20


2. 截取字符串(字符串切片)方法

2. 1 获取单个字符

语法格式:str_name[index]

str_name 表示字符串名字,index 表示索引值。

Python 允许从字符串的两端使用索引:

  • 当以字符串的左端(字符串的开头)为起点时,索引是从 0 开始计数的
  • 当以字符串的右端(字符串的末尾)为起点时,索引是从 -1 开始计数的
x = 'abcdefg'
# 获取索引为3的字符
print(x[3])  # out: d
# 从右往左获取索引为6的字符
print(x[-6])  # out: b


2. 2 获取多个字符(字符串截去/字符串切片)

语法格式:str_name[start : end : step]

  • start:表示要截取的第一个字符所在的索引(包含该字符)。如果不指定,默认为 0,即字符串的开头截取;
  • end:表示要截取的最后一个字符所在的索引(不包含该字符)。如果不指定,默认为字符串的长度;
  • step:表示切片的步长,如果省略,则默认为1,当省略该值时,最后一个冒号也可以省略。
str = "hello world!"
# 截取第2个字符
str[1]  # out: 'e'

# 从第3个字符开始截取
str[2:]  # out: 'llo world!'

# 到第4个字符结束
str[:4]  # out: 'hell'

# 截取1~5的字符
str[1:5]  # out: 'ello'

# 截取最后一个字符
str[-1]  # out: '!'

# 从第2个字符开始~倒数第二个结束
str[2:-2]  # out: 'llo worl'


3. 分割、合并及替换字符串方法

3. 1 split()方法:分割字符串(返回一个列表)

语法格式:str.split(sep, maxsplit)

sep:用于指定分隔符,可以包含多个字符。此参数默认为 None,表示所有空字符,包括空格(默认)、换行符“\n”、制表符“\t”等。当字符串中有连续的空格或其他空字符时,都会被视为一个分隔符对字符串进行分割。

maxsplit:可选参数,用于指定分割的次数,最后列表中子串的个数最多为maxsplit+1。如果不指定或者指定为 -1,则表示分割次数没有限制。

如果不指定 sep 参数,那么也不能指定 maxsplit 参数。

str = "i am a good boy!"
str.split()  # 采用默认分割符进行分割
# out: ['i', 'am', 'a', 'good', 'boy!']

str.split(" ")  # 采用空格进行分割
# out: ['i', 'am', 'a', 'good', 'boy!']

str.split(" ", 3)  # 采用空格进行分割,并且只分割前3个
# out: ['i', 'am', 'a', 'good boy!']


3. 2 join()方法:合并字符串

语法格式:new_str = str.join(iterable)

iterable:做合并操作的源字符串数据,允许以列表、元组等形式提供

# 将列表中的字符串合并成一个字符串。

list = ['console', 'log(dir)']  
'.'.join(list)  # out: console.log(dir)

  
# 将元组中的字符串合并成一个字符串。

dir = ('', 'usr', 'bin', 'env')  
type(dir)  # out: <class 'tuple'> 
'/'.join(dir)  # out: /usr/bin/env


3. 3 replace()方法:替换字符串

语法格式:new_str = str.replace(old, new[, max])

old -- 将被替换的子字符串。

new -- 新字符串,用于替换old子字符串。

max -- 可选字符串, 替换不超过 max 次

str = 'hello world'
str.replace('world', 'python')  # out: 'hello python'

str1 = 'hello-world'
str1.replace('-', '')  # out: 'helloworld'
str1.replace('-', ' ')  # out: 'hello world'


4. 检索字符串方法

str:表示原字符串;

sub:表示要检索的字符串;

start:指定检索的起始位置,也就是从什么位置开始检测。如果不指定,默认从头开始检索;

end:指定检索的终止位置,如果不指定,则表示一直检索到结尾。

注意:范围都是左闭右开

4. 1 count()方法

语法格式:str.count(sub[,start[,end]])

作用:用于检索指定字符串在另一个字符串中出现的次数,如果检索的字符串不存在则返回0,否则返回出现的次数。

str = "abcdefga"  
str.count('a')  # out: 2

str = "abcadebfgc"  
str.count('b', 1)  # out: 2
str.count('b', 2)  # out: 1


str = "abcadebfgc"  
str.count('a', 0, -3)  # out: 2
str.count('c', 3, -4)  # out: 0


4. 2 find()方法

语法格式:str.find(sub[,start[,end]])

作用:检索是否包含指定的字符串,如果检索的字符串不存在则返回-1,否则返回首次出现该字符串时的索引。

str = "abcdefga"  
str.find('a')  # out: 0

str = "abcadebfgc"  
str.find('b', 1)  # out: 1
str.find('b', 2)  # out: 6

str = "abcadebfgc"  
str.find('ab', 0, -3)  # out: 0
str.find('c', 3, -4)  # out: -1


4. 3 index()方法

语法格式:str.index(sub[,start[,end]])

作用:和find方法类似,也用于检索是否包含指定的字符串,使用index方法,当指定的字符串不存在时会抛异常。

str = "hello world!"
str.index('w')  # out: 6

'''
index()和find()的区别:
    index(): 指定的字符串不存在时会抛异常
    find(): 检索的字符串不存在则返回-1
'''

str.index('m')  # 报错
str.find('m')  # -1


4. 4 startswith()方法

语法格式:str.startswith(prefix[, start[, end]])

作用:检索字符串是否以指定的字符串开头,如果是则返回true,否则返回false。

str = "hello world!"
str.startswith('hello')  # out: True
str.startswith('hi')  # out: False


4. 5 endswith()方法

语法格式:str.endswith(prefix[, start[, end]])

作用:检索字符串是否以指定的字符串结尾,如果是则返回true,否则返回false。

str = "hello world!"
str.endswith('world!')  # out: True
str.endswith('ha')  # out: False


5.格式化字符串

语法格式:str.format(args)

str : 指定字符串的显示样式

args : 指定要进行格式转换的项,如果有多项,之间有逗号进行分割。

学习 format() 方法的难点,在于搞清楚 str 显示样式的书写格式。在创建显示样式模板时,需要使用{}来指定占位符,其完整的语法格式为:

{ [index][ : [ [fill] align] [sign] [#] [width] [.precision] [type] ] }

注意,格式中用 [ ] 括起来的参数都是可选参数,即可以使用,也可以不使用。各个参数的含义如下:

  • index:指定:后边设置的格式要作用到 args 中第几个数据,数据的索引值从 0 开始。如果省略此选项,则会根据 args 中数据的先后顺序自动分配。

  • fill:指定空白处填充的字符。注意,当填充字符为逗号(,)且作用于整数或浮点数时,该整数(或浮点数)会以逗号分隔的形式输出,例如(1000000会输出 1,000,000)。

  • align:指定数据的对齐方式,具体的对齐方式如表 1 所示。

表 1 align 参数及含义

align 含义
< 数据左对齐。
> 数据右对齐。
= 数据右对齐,同时将符号放置在填充内容的最左侧,该选项只对数字类型有效。
^ 数据居中,此选项需和 width 参数一起使用。


  • sign:指定有无符号数,此参数的值以及对应的含义如表 2 所示。

表 2 sign 参数以含义

sign参数 含义
+ 正数前加正号,负数前加负号。
- 正数前不加正号,负数前加负号。
空格 正数前加空格,负数前加负号。
# 对于二进制数、八进制数和十六进制数,使用此参数,各进制数前会分别显示 0b、0o、0x前缀;反之则不显示前缀。
  • width:指定输出数据时所占的宽度。
  • .precision:指定保留的小数位数。

  • type:指定输出数据的具体类型,如表 3 所示。

表 3 type 占位符类型及含义

type类型值 含义
s 对字符串类型格式化。
d 十进制整数。
c 将十进制整数自动转换成对应的 Unicode 字符。
e 或者 E 转换成科学计数法后,再格式化输出。
g 或 G 自动在 e 和 f(或 E 和 F)中切换。
b 将十进制数自动转换成二进制表示,再格式化输出。
o 将十进制数自动转换成八进制表示,再格式化输出。
x 或者 X 将十进制数自动转换成十六进制表示,再格式化输出。
f 或者 F 转换为浮点数(默认小数点后保留 6 位),再格式化输出。
% 显示百分比(默认显示小数点后 6 位)。

案例:

在实际开发中,数值类型有多种显示需求,比如货币形式、百分比形式等,使用 format() 方法可以将数值格式化为不同的形式。

# 以货币形式显示
print("货币形式:{:,d}".format(1000000))
# out: 货币形式:1,000,000

# 科学计数法表示
print("科学计数法:{:E}".format(1200.12))
# out: 科学计数法:1.200120E+03

# 以十六进制表示
print("100的十六进制:{:#x}".format(100))
# out: 100的十六进制:0x64

# 输出百分比形式
print("0.01的百分比表示:{:.0%}".format(0.01))
# out: 0.01的百分比表示:1%


6.去除字符串中的空格以及特殊字符

开发中,我们会遇到这样的需求,字符串前后(左右侧)不允许出现空格和特殊字符或者将用户输入的字符串中误输入的空格去除掉。这时我们就需要用到strip函数。

6. 1 strip()方法

语法格式 : str.strip([chars])

作用:去除字符串前后(左右侧)的空格或特殊字符

str1  = " hello world! "
str1.strip()  # out: 'hello world!'

str2 = "#hello world#@#"
str2.strip('#')
# out: 'hello world#@'

str3 = "@hello world!@."
str3.strip('@.')  # out: 'hello world!'


6.2 lstrip()方法

语法格式 : str.lstrip([chars])

作用:去除字符串前面(左侧)的空格或特殊字符

str1  = " hello world! "
str1.lstrip()  # out: 'hello world! '

str2 = "#hello world#@#"
str2.lstrip('#')
# out: 'hello world#@#'

str3 = "@.hello world!@."
str3.lstrip('@.')  # out: 'hello world!@.'


6. 3 rstrip()方法

语法格式 : str.rstrip([chars])

作用:去除字符串后面(右侧)的空格或特殊字符

str1  = " hello world! "
str1.rstrip()  # out: ' hello world!'

str2 = "#hello world#@#"
str2.rstrip('#')
# out: '#hello world#@'

str3 = "@.hello world!@."
str3.rstrip('@.')  # out: '@.hello world!'


7.字符串的大小写转换

7.1 str.lower()

作用:将字符串中的大写字母转换为小写字母

str = "Hello World!"
str.lower()  # out: 'hello world!'


7.2 str.upper()

作用:将字符串中的小写字母转换为大写字母

str = "Hello World!"
str.upper()  # out: 'HELLO WORLD!'


7.3 str.capitalize()

作用:将字符串中的首字母变成大写

str = "Hello World!"
str.capitalize()  # out: 'Hello world!'


7.4 str.title()

作用:将字符串中的每个单词的首字母变成大写

str="hello world!"
str.title()  # out: 'Hello World!'


7.5 str.swapcase()

作用:将字符串中的字母大小写互换(即小写字母转换为大写字母,大写字母转换为小写字母)

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