第014講:字串:各種奇葩的內建方法
測試題:
0. 還記得如何定義一個跨越多行的字串嗎(請至少寫出兩種實現的方法)?
方法一:
>>> str1 = '''待我長髮及腰,將軍歸來可好?
此身君子意逍遙,怎料山河蕭蕭。
天光乍破遇,暮雪白頭老。
寒劍默聽奔雷,長槍獨守空壕。
醉臥沙場君莫笑,一夜吹徹畫角。
江南晚來客,紅繩結髮梢。'''
方法二:
>>> str2 = '待卿長髮及腰,我必凱旋迴朝。\
昔日縱馬任逍遙,俱是少年英豪。\
東都霞色好,西湖煙波渺。\
執槍血戰八方,誓守山河多嬌。\
應有得勝歸來日,與卿共度良宵。\
盼攜手終老,願與子同袍。'
方法三:
>>> str3 = ('待卿長髮及腰,我必凱旋迴朝。'
'昔日縱馬任逍遙,俱是少年英豪。'
'東都霞色好,西湖煙波渺。'
'執槍血戰八方,誓守山河多嬌。'
'應有得勝歸來日,與卿共度良宵。'
'盼攜手終老,願與子同袍。')
1. 三引號字串通常我們用於做什麼使用?
三引號字串不賦值的情況下,通常當作跨行註釋使用,例如:
- '''這是一個三引號字串用於註釋的例子,
- 例子雖然只是簡簡單單的一句話,
- 卻毫無遮掩地體現了作者用情至深,
- 所謂愛至深處情至簡!'''
- print("I love FishC.com!")
2. file1 = open('C:\windows\temp\readme.txt', 'r') 表示以只讀方式開啟“C:\windows\temp\readme.txt”這個文字檔案,但事實上這個語句會報錯,知道為什麼嗎?你會如何修改?
會報錯是因為在字串中,我們約定“\t”和“\r”分別表示“橫向製表符(TAB)”和“回車符”(詳見:http://bbs.fishc.com/thread-92997-1-1.html),因此並不會按照我們計劃的路徑去開啟檔案。
Python 為我們鋪好了解決的道路,只需要使用原始字串操作符(R或r)即可:
>>> file1 = open(r'C:\windows\temp\readme.txt', 'r')
3. 有字串:str1 = '<a href="http://www.fishc.com/dvd" target="_blank">魚C資源打包</a>',請問如何提取出子字串:'www.fishc.com'
>>> str1[16:29]
4. 如果使用負數作為索引值進行分片操作,按照第三題的要求你能夠正確目測出結果嗎?
>>> str1[-45:-32]
5. 還是第三題那個字串,請問下邊語句會顯示什麼內容?
>>> str1[20:-36]
'fishc',加入了負數索引,問題變得有些複雜,不過自己多嘗試幾次就可以熟練掌握了。
6. 據說只有智商高於150的魚油才能解開這個字串(還原為有意義的字串):str1 = 'i2sl54ovvvb4e3bferi32s56h;$c43.sfc67o0cm99'
>>> str1[::3]
'ilovefishc.com'
動動手:
0. 請寫一個密碼安全性檢查的程式碼程式碼:check.py
# 密碼安全性檢查程式碼
#
# 低階密碼要求:
# 1. 密碼由單純的數字或字母組成
# 2. 密碼長度小於等於8位
#
# 中級密碼要求:
# 1. 密碼必須由數字、字母或特殊字元(僅限:[email protected]#$%^&*()_=-/,.?<>;:[]{}|\)任意兩種組合
# 2. 密碼長度不能低於8位
#
# 高階密碼要求:
# 1. 密碼必須由數字、字母及特殊字元(僅限:[email protected]#$%^&*()_=-/,.?<>;:[]{}|\)三種組合
# 2. 密碼只能由字母開頭
# 3. 密碼長度不能低於16位
程式演示:
# 密碼安全性檢查程式碼
#
# 低階密碼要求:
# 1. 密碼由單純的數字或字母組成
# 2. 密碼長度小於等於8位
#
# 中級密碼要求:
# 1. 密碼必須由數字、字母或特殊字元(僅限:[email protected]#$%^&*()_=-/,.?<>;:[]{}|\)任意兩種組合
# 2. 密碼長度不能低於8位
#
# 高階密碼要求:
# 1. 密碼必須由數字、字母及特殊字元(僅限:[email protected]#$%^&*()_=-/,.?<>;:[]{}|\)三種組合
# 2. 密碼只能由字母開頭
# 3. 密碼長度不能低於16位
symbols = r'''`[email protected]#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
passwd = input('請輸入需要檢查的密碼組合:')
# 判斷長度
length = len(passwd)
while (passwd.isspace() or length == 0) :
passwd = input("您輸入的密碼為空(或空格),請重新輸入:")
length = len(passwd)
if length <= 8:
flag_len = 1
elif 8 < length < 16:
flag_len = 2
else:
flag_len = 3
flag_con = 0
# 判斷是否包含特殊字元
for each in passwd:
if each in symbols:
flag_con += 1
break
# 判斷是否包含字母
for each in passwd:
if each in chars:
flag_con += 1
break
# 判斷是否包含數字
for each in passwd:
if each in nums:
flag_con += 1
break
# 列印結果
while 1 :
print("您的密碼安全級別評定為:", end='')
if flag_len == 1 or flag_con == 1 :
print("低")
elif flag_len == 3 and flag_con == 3 and (passwd[0] in chars):
print("高")
print("請繼續保持")
break
else:
print("中")
print("請按以下方式提升您的密碼安全級別:\n\
\t1. 密碼必須由數字、字母及特殊字元三種組合\n\
\t2. 密碼只能由字母開頭\n\
\t3. 密碼長度不能低於16位")
break
哈哈,這最後一題招來不少“民憤”,自己挖了個坑……
這裡把相關的疑問給大家解釋下:
1. 為啥要用 while 1 呢?主要是為了實現“如果結果是低或中則列印如何提升密碼安全級別的提示,而高則直接退出”
2. 為啥把“高”放中間呢?因為其判斷最為麻煩(注意還要求必須是字母開頭),所以很有可能滿足了“中”卻因為額外的條件滿足不了“高”,因此我們把事兒比較多的高放中間判斷,滿足不了“高”,那就只能是最後的 else“中”了。
1. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!
capitalize() | 把字串的第一個字元改為大寫 |
casefold() | 把整個字串的所有字元改為小寫 |
center(width) | 將字串居中,並使用空格填充至長度 width 的新字串 |
count(sub[, start[, end]]) | 返回 sub 在字串裡邊出現的次數,start 和 end 引數表示範圍,可選。 |
encode(encoding='utf-8', errors='strict') | 以 encoding 指定的編碼格式對字串進行編碼。 |
endswith(sub[, start[, end]]) | 檢查字串是否以 sub 子字串結束,如果是返回 True,否則返回 False。start 和 end 引數表示範圍,可選。 |
expandtabs([tabsize=8]) | 把字串中的 tab 符號(\t)轉換為空格,如不指定引數,預設的空格數是 tabsize=8。 |
find(sub[, start[, end]]) | 檢測 sub 是否包含在字串中,如果有則返回索引值,否則返回 -1,start 和 end 引數表示範圍,可選。 |
index(sub[, start[, end]]) | 跟 find 方法一樣,不過如果 sub 不在 string 中會產生一個異常。 |
isalnum() | 如果字串至少有一個字元並且所有字元都是字母或數字則返回 True,否則返回 False。 |
isalpha() | 如果字串至少有一個字元並且所有字元都是字母則返回 True,否則返回 False。 |
isdecimal() | 如果字串只包含十進位制數字則返回 True,否則返回 False。 |
isdigit() | 如果字串只包含數字則返回 True,否則返回 False。 |
islower() | 如果字串中至少包含一個區分大小寫的字元,並且這些字元都是小寫,則返回 True,否則返回 False。 |
isnumeric() | 如果字串中只包含數字字元,則返回 True,否則返回 False。 |
isspace() | 如果字串中只包含空格,則返回 True,否則返回 False。 |
istitle() | 如果字串是標題化(所有的單詞都是以大寫開始,其餘字母均小寫),則返回 True,否則返回 False。 |
isupper() | 如果字串中至少包含一個區分大小寫的字元,並且這些字元都是大寫,則返回 True,否則返回 False。 |
join(sub) | 以字串作為分隔符,插入到 sub 中所有的字元之間。 |
ljust(width) | 返回一個左對齊的字串,並使用空格填充至長度為 width 的新字串。 |
lower() | 轉換字串中所有大寫字元為小寫。 |
lstrip() | 去掉字串左邊的所有空格 |
partition(sub) | 找到子字串 sub,把字串分成一個 3 元組 (pre_sub, sub, fol_sub),如果字串中不包含 sub 則返回 ('原字串', '', '') |
replace(old, new[, count]) | 把字串中的 old 子字串替換成 new 子字串,如果 count 指定,則替換不超過 count 次。 |
rfind(sub[, start[, end]]) | 類似於 find() 方法,不過是從右邊開始查詢。 |
rindex(sub[, start[, end]]) | 類似於 index() 方法,不過是從右邊開始。 |
rjust(width) | 返回一個右對齊的字串,並使用空格填充至長度為 width 的新字串。 |
rpartition(sub) | 類似於 partition() 方法,不過是從右邊開始查詢。 |
rstrip() | 刪除字串末尾的空格。 |
split(sep=None, maxsplit=-1) | 不帶引數預設是以空格為分隔符切片字串,如果 maxsplit 引數有設定,則僅分隔 maxsplit 個子字串,返回切片後的子字串拼接的列表。 |
splitlines(([keepends])) | 在輸出結果裡是否去掉換行符,預設為 False,不包含換行符;如果為 True,則保留換行符。。 |
startswith(prefix[, start[, end]]) | 檢查字串是否以 prefix 開頭,是則返回 True,否則返回 False。start 和 end 引數可以指定範圍檢查,可選。 |
strip([chars]) | 刪除字串前邊和後邊所有的空格,chars 引數可以定製刪除的字元,可選。 |
swapcase() | 翻轉字串中的大小寫。 |
title() | 返回標題化(所有的單詞都是以大寫開始,其餘字母均小寫)的字串。 |
translate(table) | 根據 table 的規則(可以由 str.maketrans('a', 'b') 定製)轉換字串中的字元。 |
upper() | 轉換字串中的所有小寫字元為大寫。 |
zfill(width) | 返回長度為 width 的字串,原字串右對齊,前邊用 0 填充。 |