本節(jié)知識大綱:
一座柱、字符串基本操作方法
(1)字符串迷帜,使用單引號、雙引號都可以
(2)取字符串中的字符辆布,如果從前往后取,第一個字符下標為0茶鉴,逐一加一锋玲;如果從后往前取,最后一個下標是-1涵叮,往前逐一減一惭蹂。
(3)長字符串使用續(xù)航符號,反斜杠\
割粮,在行尾可以直接按回車使用續(xù)航符盾碗;或者使用""" """
注釋符號,可以保留長字符串的樣式舀瓢,保留了其中的空格與回車廷雅。
(4)轉(zhuǎn)義字符:具有特殊意義的帶反斜杠的字符標記;取消轉(zhuǎn)義:在字符串雙引號或者單引號之前加r
或者R
京髓,使其原樣輸出航缀,取消轉(zhuǎn)義的功能。
(5)獲取字符串的長度:使用len()
方法
(6)去除空格:strip()
去除前后的空格堰怨;rstrip()
去除后邊的空格芥玉;
lstrip() 去除前面的空格。
str01 = " abc "
print(str01.strip())
print(str01.lstrip())
print(str01.rstrip())
(7)字符串的大小寫:
字符串轉(zhuǎn)大寫upper()
备图;
字符串轉(zhuǎn)小寫lower()
灿巧;
字符串大小寫互換swapcase()
赶袄;
字符串第一個字母大寫capitalize()
字符串內(nèi)的所有單詞的首字母大寫title()
str01 = "hello, world"
print(str01.lower())
print(str01.upper())
print(str01.swapcase())
print(str01.capitalize())
print(str01.title())
輸出結(jié)果
hello, world
HELLO, WORLD
HELLO, WORLD
Hello, world
Hello, World
(8)判斷字符串是否為空,有兩種方法抠藕,第一種:通過求字符串的長度是否為0來判斷饿肺;第二種:直接判斷是否等于一個空字符串
str01 = ""
print("是否為空",len(str01) == 0)
print("是否為空",str01 == "")
(9)字符串運算符加號和乘號,加號表示連接字符串幢痘,乘號表示將字符串輸出多少倍唬格。
二、字符串的反轉(zhuǎn)
什么是字符串的反轉(zhuǎn)颜说,如果字符串本來是"abcd"反轉(zhuǎn)過來就是”dcba“购岗,那么該如何實現(xiàn)呢?
方法一:使用for循環(huán)反轉(zhuǎn)字符串
str01 = "abcd"
for i in range(-1,-len(str01)-1,-1):
print(str01[i],end="")
方法二:先把字符串轉(zhuǎn)為list再用reverse方法逆序輸出
str01 = "abcd"
list01 = []
# 把字符串寫入list
for i in str01:
list01.append(i)
list01.reverse()
for i in list01:
print(i,end="")
方法三:通過字符串切片的方法逆序輸出
str01 = "abcd"
print("第三種方法",str01[::-1])
三门粪、字符串的基本判斷
字符串的基本判斷語句可以用來判斷字符串中的內(nèi)容是數(shù)字喊积、大小寫、是否空白等玄妈,這種對字符串的判斷語句如果是就返回True乾吻,否則就返回False
我們從幾個案例來鞏固一下對這些判斷語句的掌握
案例01:輸入密碼,要求是數(shù)字或者字母,大于6位
str01 = input("請輸入密碼:")
if str01.isalnum() and len(str01) >= 6:
print("密碼符合要求拟蜻!")
else:
print("密碼不符合要求绎签!")
案例02:輸入手機號,要求必須是數(shù)字
str01 = input("請輸入手機號碼:")
if str01.isdigit() and len(str01) == 11: # 一般手機號都是11位數(shù)字
print("手機號符合要求")
else:
print("手機號不符合要求")
案例03:輸入一段話酝锅,統(tǒng)計大寫字母诡必、小寫字母、數(shù)字字符搔扁、漢字爸舒、其它字符數(shù)量
str01 = input("請輸入一段話:")
upper_char = 0
lower_char = 0
number_char = 0
chinese_char = 0
other_char = 0
for i in str01:
if i.islower():
lower_char += 1
elif i.isupper():
upper_char += 1
elif i.isdigit():
number_char += 1
elif i >= "\u4e00" and i <= "\u9fa5":
chinese_char += 1
else:
other_char += 1
print("字符串總數(shù)%d 大寫字母%d 小寫字母%d 數(shù)字字符%d "
"漢字%d 其它字符%d"%(len(str01),upper_char,lower_char,number_char,chinese_char,other_char))
知識補充:如何判斷一個字符是否是漢字,可以通過比較其與漢字的Unicode編碼的大小來判斷稿蹲,漢字的Unicode編碼范圍:4e00-9fa5
如果i >= "\u4e00" 且 i <= "\u9fa5"
則說明字符i
是一個漢字扭勉。
四、判斷兩個字符串是否相等
判斷兩個字符串是否相等我們通常有兩個辦法:等號
和is
;
==
:判斷字符串是否相等
is
:判斷兩個字符串是否是同一個對象
總結(jié):==
表示兩個字符串內(nèi)容是否相等苛聘;is
判斷兩個字符串是否是同一個對象(存儲的內(nèi)存地址是否是同一個)
如果有有兩個字符串雖然內(nèi)容相同涂炎,但是字符串足夠的大的話,它們存儲的地址也是不同的设哗,故用is
判斷兩個字符串是否是同一個字符串結(jié)果則顯示為false
璧尸,所以通常情況下,比較兩個字符串是否一致熬拒,主要指的是內(nèi)容是否一致爷光,所以通常是用運算符==
案例:
默寫李白的《靜夜思》,提示當前默寫為第幾句澎粟,如果連續(xù)錯誤超過三次蛀序,自動顯示正確答案并跳轉(zhuǎn)下一句
# 正確的答案用元組存儲起來(因為元組是不可修改的)
tuple01 = ("《靜夜思》","李白","床前明月光","疑是地上霜","舉頭望明月","低頭思故鄉(xiāng)")
# 總共有多少句
total_number = len(tuple01) - 2
# 當前默寫到第幾句
this_time= 0
# 總共正確的有多少句
right_total = 0
# 當前錯誤幾次
wrong_time = 0
# 當前默寫
print("當前默寫"+tuple01[1]+"的"+tuple01[0]+"總共"+str(total_number)+"句")
while this_time < total_number:
this_time += 1 # 每次數(shù)字+1
current = input("請默寫第"+str(this_time)+"句:")
if current.strip() == tuple01[this_time + 1]:
print("恭喜你欢瞪!第"+str(this_time)+"句默寫正確!")
right_total += 1
else:
wrong_time += 1
if wrong_time == 3:
print("很遺憾,第"+str(this_time)+"句默寫錯誤已達三次!正確答案為:"+tuple01[this_time+1])
wrong_time = 0
continue
else:
print("第"+str(this_time)+"默寫錯誤徐裸!請重新默寫遣鼓!")
this_time -= 1
continue
print("本次默寫總共%d句,其中正確的%d句重贺,正確率為%.2f"%(total_number,right_total,right_total/total_number))
五骑祟、查找字符串
1. 查找字符串的兩種主要方法
查找字符串在Python中主要使用兩個函數(shù)find
和index
(1)字符串查找函數(shù):find()
str01 = "www.yusheng123.cn"
print(str01.find("yusheng"))
print(str01.find("abc")) # 如果查不到,返回的是-1
輸出結(jié)果:
4
-1
使用find方法气笙,在字符串中如果能夠查到次企,返回的是包含字符串的起始位置的索引;如果查找不到潜圃,則返回-1
(2)字符串查找函數(shù):index()
str01 = "www.yusheng123.cn"
print(str01.index("yusheng"))
print(str01.index("abcd"))
輸出結(jié)果:
4
Traceback (most recent call last):缸棵、、谭期、堵第、、報錯
使用index函數(shù)查找隧出,如果能夠查到踏志,和find函數(shù)一樣,返回的是包含字符串的起始位置的索引胀瞪;如果查不到就會報錯针余,所以使用index函數(shù)查找最好使用異常處理防止報錯(異常處理的知識上一節(jié)我們已經(jīng)介紹過了)
# index查找防止查找不到,故使用異常處理
str01 = "www.yusheng123.cn"
try:
print(str01.index("abcd")) # 如果用index查找赏廓,如果查不到就會拋出異常涵紊,所以使用索引查找最好使用異常處理
except ValueError as e:
print("查找不到傍妒!")
2. 查找字符串的方法
(1)搜索到多少個指定字符串:
str.count('t')
(2)指定起始位置搜索:
str.find('t',start)
(3)指定起始位置和結(jié)束位置搜索:
str.find('t',start,end)
(4)從右邊開始查找:
str.find('t')
以上的方法都可以用index代替幔摸,不同的是使用index查找不到會拋出異常,而find會返回-1
案例:
生成500個數(shù)字的字符串颤练,判斷”88“出現(xiàn)的次數(shù)并打印出現(xiàn)的位置
import random
str_total = ""
for i in range(500):
str_total += str(random.randint(0,9))
# 出現(xiàn)88的次數(shù)
print("生成的字符串出現(xiàn)88的次數(shù):%d"%(str_total.count("88")))
# 打印具體的值
start_index = 0
current = 0
while True:
if str_total.find("88",start_index) == -1:
break
else:
current += 1
current_position = str_total.find("88",start_index)
print("第"+str(current)+"個88的位置:",current_position)
start_index = current_position+1
輸出結(jié)果:
生成的字符串出現(xiàn)88的次數(shù):4
第1個88的位置: 120
第2個88的位置: 264
第3個88的位置: 375
第4個88的位置: 405
六既忆、判斷包含字符串
1.判斷是否包含字符串的兩種方法
(1)判斷包含字符串,關(guān)鍵字就是in
判斷是否包含字符串可以使關(guān)鍵字in來實現(xiàn):
str01 = "www.yusheng123.cn"
print("str01是否包含yusheng:",("yusheng" in str01))
輸出結(jié)果:
str01是否包含yusheng: True
(2)使用查找的方法也能實現(xiàn)判斷是否包含字符串
print("str01中是否包含yusheng",str01.find("yusheng") >=0 )
雖然查找函數(shù)返回的是索引但是其結(jié)果只要大于0就能看成是包含了指定字符串
2. 判斷字符串是否以某個字符串開頭或結(jié)束
判斷字符串是否以某個字符串開頭使用關(guān)鍵字startswith
判斷字符串是否以某個字符串結(jié)尾使用關(guān)鍵字endswith
str01 = "https://www.yusheng123.cn"
if str01.startswith("https"):
print("這個是一個安全加密訪問的域名")
if str01.endswith("cn"):
print("這是一個中國的域名")
輸出結(jié)果:
這個是一個安全加密訪問的域名
這是一個中國的域名
案例:
模擬一個聊天窗口嗦玖,事先設(shè)定一些關(guān)鍵字患雇,如果發(fā)送的消息中包含設(shè)置的關(guān)鍵字,提示“禁止發(fā)送宇挫,含有敏感信息苛吱!”
tuple01 = ("垃圾","滾")
send_message = input("請輸入要發(fā)送的信息:")
# 通過一個布爾類型的值來判斷它是否匹配
is_unsafe = False
for i in tuple01:
if i in send_message:
is_unsafe = True
if is_unsafe:
print("禁止發(fā)送,含有敏感信息器瘪!")
else:
print("發(fā)送成功翠储!")
七绘雁、替換字符串
1. 使用replace替換關(guān)鍵字
替換字符串使用的關(guān)鍵字replace
,基本語法是:str.replace(<舊字符串>,<新字符串>)
str01 = "www.yusheng123.cn"
# 把cn換成com
print(str01.replace("cn","com"))
2. 應(yīng)用場景
(1)去除空格
最常見的應(yīng)用的地方是去除空格援所,我們之前去除空格的使用的strip()
方法庐舟,但是只能去除字符串前面或者后面的空格,使用replace()
能去除所有的空格住拭,包括字符串中間的挪略;
# 應(yīng)用:去除空格
str01 = " xiao yu 1926"
print(str01)
print(str01.replace(" ",""))
輸出結(jié)果:
xiao yu 1926
xiaoyu1926
(2)多出匹配的情況
如果待替換的字符串中有多處待匹配的地方,一般默認是全部替換滔岳,如果想只替換前面幾個杠娱,可以直接在函數(shù)的第三參數(shù)聲明
str01 = "abcdabcdabcd"
print(str01.replace("ab","12")) # 默認全部替換
print(str01.replace("ab","12",2)) # 只替換前面兩個
輸出結(jié)果:
print(str01)
abcdabcdabcd
12cd12cd12cd
12cd12cdabcd
案例:
模擬一個聊天窗口,事先設(shè)定一些關(guān)鍵字澈蟆,如果發(fā)送的消息中包含發(fā)送的關(guān)鍵字墨辛,把發(fā)送的信息中包含的關(guān)鍵字用*代替發(fā)送。
special_key_word_tuple = ("垃圾","滾蛋")
message = input("請輸入要發(fā)送的內(nèi)容:")
for i in special_key_word_tuple:
if i in message:
message = (message.replace(i, "*"))
print("要發(fā)送的信息為:",message)
八趴俘、拼接字符串
拼接字符串就是把多個字符串拼接成為一個睹簇,我們通常可以使用三種方法拼接字符串
(1)加號拼接
list_name = ["Tom","Jerry","Bob"]
# 加號拼接,并且用逗號隔開
names = ""
for i in list_name:
names += i + ","
print("加法拼接后的字符串為:",names)
輸出結(jié)果:
加法拼接后的字符串為: Tom,Jerry,Bob,
(2)基本格式化拼接
name = "%s,%s,%s"%(list_name[0],list_name[1],list_name[2])
print("格式化拼接后的字符串為:",names)
輸出結(jié)果:
格式化拼接后的字符串為: Tom,Jerry,Bob,
(3)join拼接
通常是用先定義分隔符寥闪,然后使用分隔符對象調(diào)用join函數(shù)太惠,join函數(shù)的參數(shù)為待分割的對象,可以是字符串也可以是列表疲憋、元組或集合
sep = "," # 分隔符
list_name = {"Tom","Jerry","Bob"}
print(sep.join(list_name))
輸出結(jié)果:
Jerry,Tom,Bob
案例:
把多條學(xué)生信息導(dǎo)出到當前目錄的./student.txt凿渊,用逗號分割每一個學(xué)生的屬性。
student_info =[["95001","張三","男","zhangsan@gmail.com"],
["95002","李四","女","lisi@gmail.com"],
["95003","王五","男","wangwu@gmail.com"],
["95004","趙六","男","zhaoliu@gmail.com"],
["95005","馬七","女","maqi@gmail.com"]]
# 分割符
sep = ","
# 循環(huán)讀取每一個學(xué)生的信息
try:
global fd
fd = open("./student.txt","a",encoding="UTF-8") # a表示追加寫入
for i in student_info:
temp = sep.join(i)
fd.write(temp+"\n")
except:
print("打開或者寫入文件出錯")
finally:
fd.close()
九缚柳、分割字符串
分割字符串的操作和我們上面拼接字符串的操作剛好相反埃脏,把一個大字符串分割成多個小字符串。通常使用函數(shù)時split()
秋忙,傳入的參數(shù)是字符串中已經(jīng)有的字符彩掐,以此字符為分割符標記進行分割。
# 分割字符串
str01 = "Tom,Jerry,Bob,Swift"
name_list = str01.split(",")
print(name_list)
輸出結(jié)果:
['Tom', 'Jerry', 'Bob', 'Swift']
分割完成之后灰追,它返回的是一個列表;
案例:
在當前目錄下讀取./student.txt中所有男生的學(xué)號和姓名
方法一:每次讀取一行
try:
global fd
fd = open("./student.txt",encoding="UTF-8")
current_line = fd.readline()
while current_line:
student_list = current_line.split(',')
if student_list[2] == "男":
print("學(xué)號:%s,姓名:%s"%(student_list[0],student_list[1]))
current_line = fd.readline()
except:
print("文件讀取失敹掠摹!")
finally:
fd.close()
方法二:把整個數(shù)據(jù)讀取到變量找那個弹澎,第一步區(qū)分學(xué)生朴下、第二步區(qū)分屬性
all_line = ""
try:
global fd
fd = open("./student.txt",encoding="UTF-8")
all_line = fd.read()
# print(all_line)
except:
print("文件打開失敗")
finally:
fd.close()
# 區(qū)分出學(xué)生
student_list = all_line.split("\n")
# 使用循環(huán)讀出每一個學(xué)生的屬性
for current_student in student_list:
detail_list = current_student.split(",")
if detail_list[2] == "男":
print(detail_list[0],detail_list[1])
十、格式化輸出
關(guān)于字符串格式化輸出的內(nèi)容苦蒿,我們在第一講變量與數(shù)據(jù)類型里面有具體講解殴胧;這里再擴充一個函數(shù)的用法:
center函數(shù),在指定字符空間中居中顯示
str01 = "1234"
print(str01.center(10)) # 在10個字符空間中居中顯示str01
print(str01.center(10,"*")) # 在10個字符空間中居中顯示str01佩迟,其余用*填充
輸出結(jié)果:
1234
***1234***
字符串格式化輸出:
%s | 標準輸出 |
---|---|
%10 | 右對齊团滥,占位符10位 |
%-10s | 左對齊免胃,占位符10位 |
%.2s | 截取兩位字符串 |
%10.2s | 10位占位符,截取兩位字符串 |