Python基礎(chǔ)學(xué)習(xí)筆記(九)字符串

本節(jié)知識大綱:


圖片.png

一座柱、字符串基本操作方法

(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])

三门粪、字符串的基本判斷

圖片.png

字符串的基本判斷語句可以用來判斷字符串中的內(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ù)findindex
(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位占位符,截取兩位字符串
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惫撰,一起剝皮案震驚了整個濱河市羔沙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厨钻,老刑警劉巖扼雏,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夯膀,居然都是意外死亡诗充,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門诱建,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝴蜓,“玉大人,你說我怎么就攤上這事俺猿【ソ常” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵押袍,是天一觀的道長诵冒。 經(jīng)常有香客問我,道長谊惭,這世上最難降的妖魔是什么汽馋? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮圈盔,結(jié)果婚禮上豹芯,老公的妹妹穿的比我還像新娘。我一直安慰自己驱敲,他們只是感情好铁蹈,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著癌佩,像睡著了一般木缝。 火紅的嫁衣襯著肌膚如雪便锨。 梳的紋絲不亂的頭發(fā)上围辙,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音放案,去河邊找鬼姚建。 笑死,一個胖子當著我的面吹牛吱殉,可吹牛的內(nèi)容都是我干的掸冤。 我是一名探鬼主播厘托,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稿湿!你這毒婦竟也來了铅匹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饺藤,失蹤者是張志新(化名)和其女友劉穎包斑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涕俗,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡罗丰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了再姑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萌抵。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖元镀,靈堂內(nèi)的尸體忽然破棺而出绍填,到底是詐尸還是另有隱情,我是刑警寧澤栖疑,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布沐兰,位于F島的核電站,受9級特大地震影響蔽挠,放射性物質(zhì)發(fā)生泄漏住闯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一澳淑、第九天 我趴在偏房一處隱蔽的房頂上張望比原。 院中可真熱鬧,春花似錦杠巡、人聲如沸量窘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚌铜。三九已至,卻和暖如春嫩海,著一層夾襖步出監(jiān)牢的瞬間冬殃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工叁怪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留审葬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像涣觉,于是被迫代替她去往敵國和親痴荐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359