字串基操
常用字串
import string
# 獲取所有的小寫字母
variable = string.ascii_lowercase # abcdefghijklmnopqrstuvwxyz
# 獲取所有的大寫字母
variable = string.ascii_uppercase # ABCDEFGHIJKLMNOPQRSTUVWXYZ
# 獲取所有的小寫和大寫字母
variable = string.ascii_letters # abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
# 獲取八進位制數字
variable = string.octdigits # 01234567
# 獲取十進位制數字
variable = string.digits # 0123456789
# 獲取十六進位制數字
variable = string.hexdigits # 0123456789abcdefABCDEF
# 獲取所有的標點字元
variable = string.punctuation # !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~
# 獲取所有可列印字元
variable = string.printable # 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c
# 獲取所有的空白字元
variable = string.whitespace
大小寫轉換
st = "hello PYTHON coders"
# 將字串的第一個字母變成大寫,其餘字母變為小寫
variable = st.capitalize() # 輸出:Hello python coders
# 返回一個滿足標題格式的字串。即所有英文單詞首字母大寫,其餘英文字母小寫
variable = st.title() # 輸出:Hello Python Coders
# 將字串中的大小寫字母同時進行互換
variable = st.swapcase() # 輸出:HELLO python CODERS
# 將字串中的所有大寫字母轉換為小寫字母
variable = st.lower() # 輸出:hello python coders
# 將字串中的所有大寫字母轉換為小寫字母。也可以將非英文語言中的大寫轉換為小寫
variable = st.casefold()
# 將字串中的所有小寫字母轉換為大寫字母
variable = st.upper() # 輸出:HELLO PYTHON CODERS
字串替換
st = "Hello Python Coders"
# 把st中的 e 替換成 E,如果 count 指定,則替換不超過 count 次,返回一個新的字串,原字串沒有改變
variable = st.replace('e', 'E') # HEllo Python CodErs
variable = st.replace('e', 'E', 1) # HEllo Python Coders
# 製表符替換,將字串中的 \\t 替換為一定數量的空格。預設tabsize=8
variable = st.expandtabs(tabsize=8)
字串倒序
st = "hello Python coders"
# 將字串倒序,反轉字串,注意:這得到的是一個新的字串
variable = st[::-1]
字串統計
st = "Hello Python Coders"
# 統計字串裡某個字元出現的次數,可以選擇字串索引的起始位置和結束位置
variable = st.count('o')
# 統計 [0, 10) 區間字母 o 出現的次數
variable = st.count('o', 0, 10)
# 獲取字串的長度
print(len(st)) # 輸出: 19
字串切片
字串切割
# 從左邊開始切割且只切割一次,根據指定的分隔符將字串進行分割。從字串左邊開始索引分隔符sep,索引到則停止索引
st.partition('l')
# 從右邊開始切割且只切割一次,根據指定的分隔符將字串進行分割。從字串右邊(末尾)開始索引分隔符sep,索引到則停止索引
st.rpartition('l')
# 常用切割從左到右,拆分字串。透過指定分隔符sep對字串進行分割,並返回分割後的字串列表
st.split(' ')
# 常用切割從右到左,拆分字串。 rsplit()函式是從字串右邊(末尾)開始分割
st.rsplit('l')
# 按照換行符分割,按照('\\n','\\r',\\r\\n'等)分隔,返回列表,預設不包含換行符,keepends=True則保留換行符
st.splitlines()
字串清理
variable = st.lstrip() # 刪除字串左邊的空格或指定字元(預設為空格)
variable = st.rstrip() # 刪除字串右邊的空格或指定字元(預設為空格)
variable = st.strip() # 刪除字串兩端的空格或指定字元(預設為空格),不會去除字串中間對應的字元
variable = "00000003210Runoob01230000000".strip('0') # 去除首尾字元 0,輸出:3210Runoob0123
字串對齊
字串中間對齊
st = "hello python coders"
# 返回長度為width,兩邊用(單字元)填充的字串,若字串的長度大於width,則直接返回字串
variable = st.center(42, '*') # 輸出:***********hello python coders************
字串左對齊
st = "hello python coders"
# 返回原字串左對齊,並使用(單字元)填充(預設為空格)至指定長度的新字串
variable = st.ljust(42, '*') # 輸出:hello python coders***********************
字串右對齊
st = "hello python coders"
# 返回原字串右對齊,並使用(單字元)填充(預設為空格)至指定長度的新字串
variable = st.rjust(42, '*') # 輸出:***********************hello python coders
字串填充對齊
st = "hello python coders"
# 返回指定長度的字串,使原字串右對齊,前面用0填充到指定字串長度
variable = st.zfill(42) # 輸出:00000000000000000000000hello python coders
字串查詢
使用 find() 方法從左往右查詢
st = "hello python coders"
# 查詢字串中指定的子字串sub第一次出現的位置,可以規定字串的索引查詢範圍。若無則返回 -1
variable = st.find('e') # 輸出:1
variable = st.find('e', 3) # 輸出:16
variable = st.find('e', 3, 10) # 輸出:-1
使用 rfind() 方法從右往左查詢
st = "hello python coders"
# 查詢字串中指定的子字串sub最後一次出現的位置,可以規定字串的索引查詢範圍。若無則返回 -1
variable = st.rfind('e') # 輸出:16
variable = st.rfind('e', 6) # 輸出:16
variable = st.rfind('e', 6, 10) # 輸出:-1
variable = st.rfind('e', 0, 10) # 輸出:1
使用 index() 方法從左往右查詢
st = "hello python coders"
# 查詢字串中第一次出現的子字串的位置,可以規定字串的索引查詢範圍[star, end)。若無則會報錯
variable = st.index('e') # 輸出:1
variable = st.index('e', 2) # 輸出:16
variable = st.index('e', 2, 8) # 報錯
使用 rindex() 方法從右往左查詢
st = "hello python coders"
# 查詢字串中最後一次出現的子字串的位置,可以規定字串的查詢範圍[star, end)。若無則會報錯
variable = st.rindex('e') # 輸出:16
variable = st.rindex('e', 3) # 輸出:16
variable = st.rindex('e', 0, 5) # 輸出:1
variable = st.rindex('e', 2, 8) # 報錯
字串拼接
使用 “+” 號拼接
str1 = "Hello, "
str2 = "World!"
result = str1 + str2
print(result) # 輸出: Hello, World!
使用 join() 方法拼接
str_list = ["Hello", "World", "!"]
result = "".join(str_list)
print(result) # 輸出: HelloWorld!
字串格式化
st = "hello Python coders"
print(f"{st}") # 輸出:hello Python coders
print(f"{st=}") # 輸出:st='hello Python coders'
test = 'My name is {}'
# 格式化字串,在字串中使用大括號作為佔位符
print(f"{test.format('jack')}") # 輸出:My name is jack
people = {"name": "john", "age": 33}
name_age = 'My name is {name}, i am {age} old!'
# 僅使用於字串格式中可變資料引數來源於字典等對映關係資料時可以使用這種方式
print(f"{name_age.format_map(people)}") #輸出:My name is john, i am 33 old!
字串去重
透過for迴圈實現去重
name = '王李張李陳王楊張吳周王劉趙黃吳楊'
newname = ''
for char in name:
if char not in newname:
newname += char
print(newname)
透過while迴圈實現去重
name = '123241536718965'
newname = ''
length = len(name) - 1
while True:
if length >= 0:
if name[length] not in newname:
newname += name[length]
length -= 1
else:
break
print(newname)
利用集合的特性實現去重
name = '王李張李陳王楊張吳周王劉趙黃吳楊'
newname = list(set(name))
# 保持索引順序不變
newname.sort(key=name.index)
print(''.join(newname))
在原字串上刪除實現去重
name = '王李張汪李陳王楊張吳周王劉趙黃吳楊'
for s in name:
if s in name[1:]:
name = name[1:]
else:
name = name[1:] + name[0]
print(name)
利用字典的特性實現去重
name = '王李張李陳王楊張吳周王劉趙黃吳楊'
# 使用fromkeys()方法把字串轉成字典
mylist = list({}.fromkeys(name).keys())
print(''.join(mylist))
字串判斷
判斷以什麼開頭或以什麼結尾
st = "hello python coders"
# 判斷字串是否以指定字元或子字串開頭
variable = st.startswith('h') # 輸出:True
# 判斷字串是否以指定字元或子字串結尾
variable = st.endswith('a') # 輸出:False
判斷字串大小寫
# 檢測字串中的字母是否全由大寫字母組成
variable = st.isupper()
# 檢測字串中的字母是否全由小寫字母組成
variable = st.islower()
判斷字串是否是有效識別符號
# 判斷str是否是有效識別符號。str為符合命名規則的變數,則返回True,否則返回False
variable = st.isidentifier()
判斷字串是否只由空格組成
# 檢測字串是否只由空格組成。若字串中只包含空格,則返回 True,否則返回 False
variable = st.isspace()
判斷字串是否只由字母組成
# 檢測字串是否只由字母組成,字串中至少有一個字元且所有字元都是字母則返回True,否則False
variable = st.isalpha()
判斷字串是否只由字母和數字組成
# 檢測是否由字母和數字組成,str中至少有一個字元且所有字元都是字母或數字則返回True,否則False
variable = st.isalnum()
判斷字串是否只包含十進位制字元
# 檢查字串是否只包含十進位制字元。字串中若只包含十進位制字元返回True,否則返回False
variable = st.isdecimal()
# 檢測字串是否只由數字組成.字串中至少有一個字元且所有字元都是數字則返回True,否則返回False
variable = st.isdigit()
# 測字串是否只由數字組成,字串中只包含數字字元,則返回 True,否則返回 False
variable = st.isnumeric()
判斷是否有列印後不可見字元
# 判斷字串中是否有列印後不可見的內容
variable = st.isprintable()
判斷是否是標題格式的字串
# 檢測判斷字串中所有單詞的首字母是否為大寫,且其它字母是否為小寫
variable = st.istitle()
判斷是否為空或者都是ASCII字元組成
# 字串為空或字串中的所有字元都是 ASCII,則返回 True,否則返回 False
variable = st.isascii()
常見的處理字串需求
刪除字串中的所有數字
# 將字串中的數字移除
message = ''.join(list(filter(lambda x: x.isalpha(), 'abc123def4fg56vcg2')))
print(message)
判斷兩個字串是否為異序詞
異序詞是透過重新排列不同單詞或短語的字母而形成的單詞或短語。如果兩個字串的 Counter 物件相等,那麼它們就是相同字母異序詞對。
from collections import Counter
s1, s2, s3 = "acbde", "abced", "abcda"
c1, c2, c3 = Counter(s1), Counter(s2), Counter(s3)
if c1 == c2:
print('1和2是異序詞')
if c1 == c3:
print('1和3是異序詞')
else:
print('1和3不是異序詞')
按照拼音順序對中文漢字進行排序
from xpinyin import Pinyin # 匯入漢字轉拼音模組
def my_sort(wordlist): # 指定要排序的列表
pin = Pinyin() # 建立漢字轉拼音物件
temp = [] # 儲存轉換結果的空列表
for item in wordlist: # 遍歷品牌名稱列表
temp.append((pin.get_pinyin(item), item)) # 將漢字的拼音和漢字放到一個元組中,再新增到列表中
temp.sort() # 對列表進行排序
result = [] # 儲存排序後的列表
for i in range(len(temp)): # 遍歷排序後的列表
result.append(temp[i][1]) # 取出漢字儲存到新列表中
return result # 返回排序後的列表
print(my_sort(['華為', '小米' , '蘋果', '三星' ])) # 呼叫函式時指定一個品牌名稱列表
常用演算法對字串進行加密
import hashlib
str = input('請輸入要加密的字串:')
#MD5加密(返回32位16進製表示字串)
md5 = hashlib.md5()
md5.update(str.encode('utf-8'))
print('MD5加密:',md5.hexdigest())
#SHA1加密(返回40位16進製表示字串)
sha1 = hashlib.sha1()
sha1.update(str.encode('utf-8'))
print('SHA1加密:',sha1.hexdigest())
#SHA256加密(返回64位16進製表示字串)
sha256 = hashlib.sha256()
sha256.update(str.encode('utf-8'))
print('SHA256加密:',sha256.hexdigest())
# 採用雜湊演算法計算後的MD5加密
import hmac
pwd = str.encode('utf-8')
key = 'id'.encode('utf-8')
h = hmac.new(key, pwd, digestmod='MD5')
print('更安全的MD5加密:', h.hexdigest())
簡單加密
in_str = 'hello'
out_str = '12345'
sm = st.maketrans(in_str, out_str)
print(f"製作翻譯表,常與translate()函式連用。即:返回用於translate方法翻譯的轉換表:{st.maketrans(in_str, out_str)}")
print(f"str.translate方法翻譯的轉換表。:{st.translate(sm)}")