Python连载(0012): 细数Python字符串的实用操作


之前老王整理过一篇字符串的基本知识 Python连载(0004): 基本数据类型之字符串,今天再来研究研究字符串还有哪些实用的操作。

1. 字符串的不可变性

字符串的不可变是指Python不允许只更改字符串中某一个或者某一段字符。例如,现在有个字符串"Hello World.",如果现在想把World中的W改成小写,可以像列表那样直接用索引找到W的位置然后赋值改变吗?

string_example = "Hello World."

# 现在尝试直接将World中的W变成小写w
# W的索引是6
print(string_example[6])
string_example[6] = "w"	# 利用索引,直接将小写w写到指定位置

image-20210128230141331

你看,直接改变字符串的某一个字符是不允许的。

2. 字符串的实用操作

首先,我们通过dir()来看看字符串支持哪些操作。

>>> dir("string")
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'removeprefix', 'removesuffix', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

诶,除去前后带下划线的,剩下的也真是不少,那就来看看它们都能干些啥。

2.1 capitalize(): 将字符串的首字母大写

str_a = "today is Monday."
str_b = str_a.capitalize()
print(str_a)
print(str_b)

image-20210128231133350

2.2 casefold(): 将字符串所有字母变为小写

str_a = "Hello, my name is Bryan."
str_b = str_a.casefold()
print(str_a)
print(str_b)

image-20210128231520790

**经验总结:**这个功能很实用,有些时候我们会要求用户输入yes进行确认,有些时候客户可能开了大写,然后输入了YES或者Yes,为了能正常识别这两种输入,那么我们可以这么写代码:

# 普通青年版
confirm = input("请输入yes进行确认:")
if confirm == "yes" or confirm == "YES" or confirm == "Yes":
    print("收到确认!")
else:
    print("未收到确认!")
    
# 文艺青年版
confirm = input("请输入yes进行确认:")
if confirm.casefold() == "yes":
    print("收到确认!")
else:
    print("未收到确认!")

很明显,使用casefold()写出来的代码更简洁。

注意casefold()用于unicode编码的字符串。字符串还有一个lower()操作,也是将字符串转换为小写,但是用于ASCII编码的字符串。

2.3 center(): 字符串扩展长度并居中显示

在实际开发过程中,我们有时候会构建类似下面这种用户提示界面:

image-20210128233046048

像上面的第一行和最后一行,长度相同,有效字符都位于中心位置,这种字符串怎么快速实现?难道要一个字符一个字符的查吗?那太麻烦了,使用center()很容易就搞定。

# 基于"Test Start"生成一个长度为20的字符串,
# 把"Test Start"放在中间位置,其他位置用星号"*"填充。
print("Test Start".center(20, "*"))

print("Test 1 done.")
print("Test 2 done.")

# 基于"Test End"生成一个长度为20的字符串,
# 把"Test End"放在中间位置,其他位置用星号"*"填充。
print("Test End".center(20, "*"))

不难看出,center()就是基于指定字符串,构建一个特定长度的字符串,同时可以指定多出来的位置使用什么字符填充。如果只给center()传递一个字符串长度参数,那么默认会使用空格来填充多余空间。

2.4 count(): 统计字符出现的次数

count()可以用来统计某个特定字符或者某段特定字符在字符串中出现的次数,例如:

str_a = "大家晚上好,我是老王。老王就是我,我就是老王。"

# 统计在整个字符串中"我”字出现的次数
print(str_a.count("我"))

# 统计在整个字符串中"老王”字出现的次数
print(str_a.count("老王"))

# 统计在str_a的第10个字符至字符串末尾,"我"出现的次数
print(str_a.count("老王", 9, -1))

image-20210128234336791

没什么复杂的,唯一需要注意的就是,count()可以在字符串的某一段进行统计,只要把起始位置结束位置传递给它就行。

2.5 endswith(): 判断字符串是否以某个/段字符结尾

name = "James"

# 判断names是不是以"es"结尾
if name.endswith("es"):
    print("{}是以es结尾的字符串。".format(name))

2.6 find(): 查找某个/段字符在字符串中的位置

str_a = "大家晚上好,我是老王。老王就是我,我就是老王。"

# 查找"老王”在字符串中的位置
print(str_a.find("老王"))

# 从第10个字符开始,一直到最后一个字符,查找"老王"的位置
print(str_a.find("老王", 9, -1))

image-20210128235728569

关于find(),只需要注意以下几点:

  • find()是从左到右开始查找,并且只会返回它找到的第一个符合条件的位置。
  • find()可以指定从字符串哪一段开始查找,只要传给它起始位置结束位置就可以,但是,find()返回的结果是找到的某个/段字符在整个完整字符串中的位置

2.7 index(): 查找某个/段字符在字符串中的位置

index()find()很类似。

str_a = "大家晚上好,我是老王。老王就是我,我就是老王。"

# 查找"老王”在字符串中的位置
print(str_a.index("老王"))

# 从第10个字符开始,一直到最后一个字符,查找"老王"的位置
print(str_a.index("老王", 9, -1))

index()需要注意的点与find()相同。

2.8 isdigit(): 判定字符串是否全为数字

str_a = "1234567890"
print(str_a.isdigit()) # 字符串全是数字字符,返回True

str_a = "12345a"
print(str_a.isdigit()) # 字符串中有字母a,返回False

image-20210129172036585

经验总结isdigit()是很有用的功能,有些场景下,需要客户只能输入数字。所以接收到用户输入之后,需要先用isdigit()判定,然后再进行处理。例如:

inp = input("请输入你的年龄:")
if inp.isdigit():
    print("你的年龄是{}岁。".format(inp))
else:
    print("请输入数字,当前检测到非法字符。")

image-20210129172534543

2.9 islower(): 判定字符串的字母是否全为小写

inp = input("请输入一串字符:")
if inp.islower():
    print("{}中字母全是小写。".format(inp))
else:
    print("{}中字母不全是小写。".format(inp))

image-20210129173111967

关于islower(),需要注意:

  • 它只会判定字符串中的字母是否全为小写,如果字符串中有数字、特殊符号等,它会装作看不见,不会影响最终的判定结果。

2.10 isupper(): 判定字符串的字母是否全为大写

islower()isupper()类似,只不过它是用来判断大写子母的。

inp = input("请输入一串字符:")
if inp.isupper():
    print("{}中字母全是大写。".format(inp))
else:
    print("{}中字母不全是大写。".format(inp))

image-20210129173540162

2.11 isspace(): 判定字符串是否全由空白符组成

str_a = "    "
print(str_a.isspace())

image-20210129173702121

注意tab空格都算是空白符。

2.12 join(): 把可迭代对象的元素用特定字符串联起来

test_list = ["www", "baidu", "com"]
str_a = ".".join(test_list) # 使用"."将test_list列表的元素串联起来
print(str_a)

image-20210129215340183

注意:被拼接的可迭代对象的元素必须都是字符串。

2.13 lower(): 将字符串转为小写

str_a = "aBcDEFg"
str_b = str_a.lower()
print(str_a)
print(str_b)

经验总结lower()的实用性可以参考2.2 casefold()部分的说明,二者的区别在于,lower()用于ASCII编码字符串,casefold()用于unicode字符串。

2.14 lstrip(): 删除字符串左侧的空白符

str_a = "    ABC"
str_b = str_a.lstrip()	# 删除"    ABC"中"ABC"左边的空白符
print(str_a)
print(str_b)

image-20210129221102634

2.15 rstrip(): 删除字符串右侧的空白符

str_a = "ABC    "
str_b = str_a.rstrip()	# 删除"ABC    "中"ABC"右边的空白符
print(str_a)
print(str_b)

image-20210129221212343

2.16 strip(): 删除字符串两侧的空白符

str_a = "   ABC   "
str_b = str_a.strip()	# 删除"ABC"两侧的空白符
print(str_a)
print(str_b)

image-20210129221721867

经验总结strip()也是经常用的操作,在处理某些数据的时候,通常需要先把数据两侧的空白符删掉,然后再进行处理。例如,我们让用户输入某个信息,但是可能他输入的时候会不小心在有效信息的前后带上了空格,这时候就需要strip()帮忙了。

inp = input("请输入你的年龄:")
inp = inp.strip()	# 删除用户输入信息两侧的空白符
if inp.isdigit():
    print("你的年龄是{}岁。".format(inp))
else:
    print("请输入正确的数字。")

image-20210129222150335

2.17 replace(): 将字符串中的某个/段字符进行替换

intro = "大家好,我是老王,我今年40岁。"

# 将字符串intro中的“老王”替换成“老李”
new_intro = intro.replace("老王", "老李")
print(new_intro)

# 将字符串intro中的所有的“我”替换成“他”
new_intro2 = intro.replace("我", "他")
print(new_intro2)

# 将字符串intro中的“我”替换成“他”,但是只替换一个地方
new_intro3 = intro.replace("我", "他", 1)
print(new_intro3)

image-20210129223618058

注意:默认情况下,replace()会将所有符合条件的地方都替换,但也可以给它传递一个数值,表示需要它替换几处地方。

2.18 split(): 在指定的分隔符处拆分字符串,返回拆分后形成的列表

names = "老王,老李,老张,老赵"

# 用逗号","作为分隔符,将字符串拆分,得到一个名字列表
name_list = names.split(",")
print(name_list)

image-20210129224121455

经验总结:split()在处理字符串数据时经常用到。

2.19 startswith(): 判断字符串是否以某个/段字符开头

str_a = "Hello, everyone."

# 判断字符串是否以"Hello"开头
if str_a.startswith("Hello"):
    print("字符串以Hello开头。")
else:
    print("字符串不以Hello开头。")

2.20 swapcase(): 切换大小写

将字符串中的小写字母变成大写,大写字母变成小写。

str_a = "AbCdEfG"
str_b = str_a.swapcase()
print(str_a)
print(str_b)

image-20210129224717116

2.21 upper(): 将小写字母转换成大写

str_a = "AbCdEfG"
str_b = str_a.upper()
print(str_a)
print(str_b)

image-20210129224821563

经验总结upper()也比较实用,像casefold()lower()一样,也可用来判断用户输入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值