1. 程式人生 > >第014講:字串:各種奇葩的內建方法

第014講:字串:各種奇葩的內建方法

測試題:

0. 還記得如何定義一個跨越多行的字串嗎(請至少寫出兩種實現的方法)?

方法一:
   
>>> str1 = '''待我長髮及腰,將軍歸來可好?
此身君子意逍遙,怎料山河蕭蕭。
天光乍破遇,暮雪白頭老。
寒劍默聽奔雷,長槍獨守空壕。
醉臥沙場君莫笑,一夜吹徹畫角。
江南晚來客,紅繩結髮梢。'''
   
方法二:
   
>>> str2 = '待卿長髮及腰,我必凱旋迴朝。\
昔日縱馬任逍遙,俱是少年英豪。\
東都霞色好,西湖煙波渺。\
執槍血戰八方,誓守山河多嬌。\
應有得勝歸來日,與卿共度良宵。\
盼攜手終老,願與子同袍。'
   
方法三:
   
>>> str3 = ('待卿長髮及腰,我必凱旋迴朝。'
'昔日縱馬任逍遙,俱是少年英豪。'
'東都霞色好,西湖煙波渺。'
'執槍血戰八方,誓守山河多嬌。'
'應有得勝歸來日,與卿共度良宵。'
'盼攜手終老,願與子同袍。')

1. 三引號字串通常我們用於做什麼使用?

三引號字串不賦值的情況下,通常當作跨行註釋使用,例如:

  1. '''這是一個三引號字串用於註釋的例子,
  2. 例子雖然只是簡簡單單的一句話,
  3. 卻毫無遮掩地體現了作者用情至深,
  4. 所謂愛至深處情至簡!'''
  5.  
  6. 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 填充。