一、 什么是字符串(str)
- 字符串是
容器型數(shù)據(jù)類型,用單引號或雙引號作為容器的標志,元素不需要用逗號隔開 - 字符串是
不可變的(不支持增刪改),字符串是有序的(支持下標操作) - 字符串中的元素,只能是文本符號(所有計算機能表達出來的符號),一個符號對應一個元素
- 字符串中每個獨立的元素叫字符,python中只有字符的概念,但是沒有字符對應的數(shù)據(jù)類型
1) 空字符串和非空字符串
# 空字符串
str1 = ''
str2 =""
str3 = ''''''
str4 = """"""
#非空字符串
str11 = 'abd'
str22 ="你家"
str33 = '''hello'''
str44 = """world"""
2)字符(字符串中的元素)
-
字符串中的字符分兩種,普通字符,轉義字符
- 1)普通字符 : 除了轉義字符以外的所有字符
- 2)轉義字符 : 在指定符號前加\用來表示一些特殊功能和特殊意義的字符
\n 換行
\t 制表符(按tab鍵)
\' 單引號
\" 雙引號
\\ 反斜杠
?
編碼字符:\u 加上4位的十六進制:\u4e00
str1 = '\tabc\n123'
print(str1)
str2 ='abc\'123'
print(str2)
str3 = 'acd\\n123'
print(str3)
#注意:計算字符串長度的時候,一個轉意字符串的長度是1
str5 = 'u789a'
str6 = '\u789a你好'
print (str5,str6)
-
阻止轉義
在字符串的最前面加r/R,那么這個字符串中所有的轉義符都無效
str7 = r'\tqwe\nsdf\u4e00'
print (str7)
#應用1:windows路徑
path = r'c\nan\temp'
print (path)
#應用2:正則表達式
?
二、什么是字符編碼
- 計算機在存儲數(shù)據(jù)的時候,只能存數(shù)字,而且存的數(shù)字的補碼
- 為了能夠讓計算機存儲文本數(shù)據(jù),給每個字符關聯(lián)了一個固定的數(shù)字,用來對這個字符進行存儲,每個字符關聯(lián)的那個數(shù)字就是這個字符的編碼值
編碼表
1)ASCII碼表 一個字節(jié)保存一個字符(碼值范圍:0~127)
- a. 數(shù)字在字母的前面
- b. 大寫字母在小寫字母前面(字母之間是連續(xù)遞增)
- c. 大寫字母和小寫字母之間有其他符號
2)Unicode編碼表
- Unicode編碼表是對ASCII碼表的擴展,Unicode編碼表包含了ASCII碼表中的符號
- Unicode編碼表包含了世界上所有國家所有名族所有的語言的所有符號(范圍:ffff)
- 中文范圍:4e00~9fa5
1)chr函數(shù)
chr(編碼值) 獲取指定編碼值對應的字符
print (chr(0x0f00))
for x in range(0x0f00,0x0fff):
print (chr(x), end = ',')
count = 0
for x in range(0x4e00,0x9fa5):
print (chr(x),end = ' ')
count += 1
if count%40 == 0:
print ()
2)ord函數(shù)
ord(字符) 獲取指定字符對應的編碼值
print ()
print (ord('傻'),ord('瓜'))
3)編碼字符
str1 = '\u0f00你好!'
print (str1)
三、獲取字符串中的元素(獲取字符)
# 字符串獲取元素和列表獲取元素的語法一樣
str1 ='how are you'
# 1)獲取單個元素
print (str1[2],str1[-2])
# 2)切片
print(str1[1:3])
print(str1[-3::-1])
# 3)遍歷
for x in str1:
print(x,end='')
print()
for index in range(len(str1)):
print(str1[index],end='')
print()
四、字符串的其他操作
1) +,*
- 字符串1+字符串2
- 字符串*n
s1 = '123'
s2 = 'abc'
print(s1+s2)
print(s1*2)
2) ==,!=
print(s1 == '123') #True
print(s1 == '321') #False
3) >,<,>=,=<,(針對兩個字符串)
s3 = 'abcd'
s4 = 'ABC'
print(s3>s4) #True 比較第一組不相等的字符的編碼值的大小
應用:
- 判斷是否是數(shù)字字符:'0'<= char <='9'
- 判斷是否是小寫字母:'a'<=char <='z'
- 判斷是否是大寫字母:'A'<=char<='Z'
- 判斷是否是字母: 'a'<=char <='z' or 'A'<=char<='Z'
- 判斷是否是中文字符:'\u4e00'<= char<='\u9fa5'
舉個例子
#例1: 輸入一個字符串,統(tǒng)計字符串中字母和中文的個數(shù)
s5 = 'hello 你好嗎?'
count1 = 0
count2 = 0
for s in s5:
if s >='\u4e00' and s<='\u9fa5':
count1 += 1
elif 'a'<= s <='z' or 'A'<= s <='Z':
count2 += 1
print('中文字符個數(shù)',count1,'英文字符個數(shù)',count2)
#例2:判斷輸入的是否是純數(shù)字字符串
s6 = '12345'
for s in s6:
if not '0'<= s <='9':
print('不是純數(shù)字')
break
else:
print('是純數(shù)字')
4) in 和 not in
字符串1 in 字符串2 判斷字符串1是否是字符串2的子串
print('abc' in 'acbwe') #False
print('abc' in 'abcmm') #True
五、相關函數(shù)
- max,min,sum,sorted,reversed等,都可以使用于字符串
- len(字符串) - 求字符串長度
- str(數(shù)據(jù)) - 將自定義數(shù)據(jù)轉換成字符串
- 所有的數(shù)據(jù)都能轉換成字符串
- 將數(shù)據(jù)的打印值作為字符串的內容
- center,rjust,ljust,zfill(居中,右對齊,左對齊)
- 字符串.center(長度,填充字符) 產(chǎn)生一個新的字符串
- 字符串.zfill(長度)== 字符串.rjust(長度,'0')
print('abc'.center(7,'-'))
print('abc'.rjust(7,'*'))
#舉例:給任意一個商品的數(shù)字編碼值,換成固定格式商品編碼
num = ['33','44']
str1 = 'GD'
for n in num:
print(str1 + n.rjust(4,'0'))
-
replace
字符串1.replace(字符串2, 字符串3) - 將字符串1中的字符串2全部替換成字符串3
字符串1.replace(字符串2, 字符串3, N) - 將字符串1中前 N 個字符串2替換成字符串3
str1 = 'how are you? i am fine, Thank you! And you?'
print(str1.replace('you', 'me')) # how are me? i am fine, Thank me! And me?
print(str1.replace('you', 'me', 1)) # how are me? i am fine, Thank you! And you?
-
count
字符串1.count(字符串2) - 統(tǒng)計字符串1中字符串2出現(xiàn)的次數(shù)
字符串1.count(字符串2, 開始下標, 結束下標) - 在字符串1中指定范圍內統(tǒng)計字符串2出現(xiàn)的次數(shù)
print(str1.count('you')) # 3
num = str1.count('you', 0, 11) # 1
print(num)
-
expandtabs(拋棄)
- 字符串.expandtabs() - 將字符串中的制表符替換成 8 個空格(只針對下標是0的制表符有效,后面是 8 - 3)
- 字符串.expandtabs(N) - 將字符串中的制表符替換成 N 個空格 (只針對下標是0的制表符有效,后面是 - 3)
str2 = 'Naa\tabc\t123'
new_str2 = str2.expandtabs(2)
print(str2, len(str2))
print(new_str2, len(new_str2))
- 將制表符替換成8個空格
new_str2 = str2.replace('\t', ' '*8)
print(new_str2)
- 字符串切割
- 字符串1.split(字符串2) - 將字符串1按照字符串2為切割點進行切割
- 字符串1.split(字符串2, N) - 將字符串1按照字符串2為切割點進行切割,切 N 次
- 字符串1.rsplit(字符串2, N) - 將字符串1按照字符串2為切割點進行切割,切 N 次, 從后往前切
str1 = 'how are you? I am fine, Thank you! And you?'
print(str1.split(' ')) # ['how', 'are', 'you?', 'i', 'am', 'fine,', 'Thank', 'you!', 'And', 'you?']
print(str1.split(' ', 2)) # ['how', 'are', 'you? i am fine, Thank you! And you?']
print(str1.rsplit(' ', 2)) # ['how are you? i am fine, Thank you!', 'And', 'you?']
- 刪除字符
- 字符串1.strip() - 同時刪除字符串最左邊和最右邊的空白
- 字符串1.lstrip() - 刪除字符串中最左邊的所有空白
- 字符串1.rstrip() - 刪除字符串中最右邊的所有空白
- 字符串1.strip(字符串2) - 同時刪除字符串最左邊和最右邊的字符串2
- 字符串1.lstrip(字符串2) - 刪除字符串中最左邊的所有字符串2
- 字符串1.rstrip(字符串2) - 刪除字符串中最右邊的所有字符串2
str3 = '\n\t abc 123\n 你好 \n'
print('============================')
print(str3)
print('============================')
print(str3.lstrip())
print('============================')
print(str3.rstrip())
print('============================')
print(str3.strip())
print('============================')
str4 = '**1**abc123***'
print(str4.strip('*')) # 1**abc123
print(str4.rstrip('*')) # **1**abc123
print(str4.lstrip('*')) # 1**abc123***
- 字符串查找
- 字符串1.find(字符串2) - 獲取字符串2第一次在字符串1中出現(xiàn)的位置(用正的下標值表示),如果找不到返回 -1
- 字符串1.find(字符串2, 開始下標, 結束下標)
str1 = 'how are you? i am fine, Thank you! And you?'
print(str1.find('you')) # 8
# 練習1:寫代碼實現(xiàn)查找字符串str1中所有的 'you'出現(xiàn)的位置
start_index = 0
indexs = []
while True:
index = str1.find('you', start_index)
if index == -1:
break
start_index = index + 3
indexs.append(index)
print(indexs)
-
拼接
字符串.join(容器) - 將容器中元素用指定字符串連接在一起(容器中的元素是字符串)
list1 = ['路路', '浩浩', '榮榮']
new_str = ' and '.join(list1)
print(new_str)
new_str2 = '+'.join('abc')
print(new_str2)
# 練習2:用列表推導式實現(xiàn)將任意容器中的元素用join進行連接
nums = [10, 20, '30', True]
# print('+'.join(nums)) # TypeError: sequence item 0: expected str instance, int found
nums = {'name': '晴晴', 'age': 18, 'sex': '女'}
new_str3 = ' '.join([str(x) for x in nums.values()])
print(new_str3) #晴晴 18 女