1、字符串常規操作
1.1、拼接字符串
使用“+”號可以實現多個字符串的拼接,併產生一個字符串對象。
如
a = "123"
print(a+"1234")
1.2計算字符串長度
使用len()函數
如
str ="123a,時候"
print(len(str))
輸出
7
可以看出在len函數計算字符串的長度時,不區分數字,英文,漢字,所有字符都認爲是一個字節
但是,如果採用UTF-8編碼,漢字佔3個字節,採用GBK或者GB2312編碼時,漢字佔2個字節
如
str ="123a,時候"
print(len(str.encode())) #utf-8編碼
print(len(str.encode(gbk))) #gbk編碼
輸出
15
12
1.3、截取字符串
通過切片方法實現
語法格式如下
string(start : end : step)
如
str = "你就是個啊哈"
str1 = str[1] #截取第二個字符
str1 = str[2:] #從第3個字符開始截取
str2 = str[:2] #從左邊開始截取2個字符
str3 = str[2:4] #截取第3個到第4個字符
1.4、分隔字符串
使用split函數分隔
語法格式
str.split(sep,maxsplit)
說明
1、str:表示進行分隔的字符串
2、sep表示指定的分隔符,可以包含多個指定字符,如果不指定,那麼默認爲None,即所有的空字符(包括空格,\n等等)
3、maxsplit:可選參數,用於指定分隔的次數,如果不指定或者爲-1,分隔次數沒有限制,否則返回的元素最多爲maxsplit+1。
4、如果不指定sep,也不能指定maxsplit
5、返回值爲字符串列表
1.5、檢索字符串
1、count方法
count()方法檢索字符串在另一個字符串中出現的次數。如果字符串不存在返回0,否則返回次數,其語法格式如下。
str.count(sub[,start[,end]])
說明:
str表示原字符串
sub表示要檢索的字符串
start表示可選參數,檢索的起始位置,若不指定,從頭檢索
end,與start相似。
2、find方法
檢索是否包含指定的字符串,如果檢索的字符串不存在則,返回-1,否則返回該字符串首次出現的索引
語法格式
str.find(sub[,start[,end]])
3、index()方法
與find()方法類似,不過使用index()方法,當指定的字符串不存在時拋出異常
語法格式
str.index(sub[,start[,end]])
4、startwith()方法
檢測是否以指定字符串開頭,是返回True,不是返回False
語法格式:
str.startswith(prefix[,start[,end]])
參數說明,str表示原字符串,prefix表示要檢索的字符串
其他參數說明與find()方法類似
5、endwith()方法
檢測是否以指定字符串結尾,是返回True,不是返回False
語法格式
str.endswith(suffix[,start[,end]])
1.6、字母的大小寫轉換
1、lower()方法
將字符串中的全部的大寫字母轉化爲小寫字母。
語法格式:
str.lower()
2、upper()方法
將字符串中的全部的小寫字母轉化爲大寫字母。
語法格式:
str.upper()
3、swapcase()方法
同時將字符串中的全部的小寫字母轉化爲大寫字母,全部的大寫字母轉化爲小寫字母。
str.swapcase()
1.7、去除字符串中的空格和特殊字符
特殊字符在這裏指的是:\t \r \n(製表、回車、換行)
1、strip()方法
去除字符串的左右兩側的空格和特殊字符
語法格式
str.strip([chars])
如
str1 = " 12323 \n"
print("原字符串str1:" + str1)
print("字符串:" + str1.strip() + ".") # 去除首尾的空格和特殊字符
str2 = "#133#."
print("原字符串str2:" + str2)
print("字符串:" + str2.strip('#.')) #去除首位的#或者.
輸出
原字符串str1: 12323
字符串:12323.
原字符串str2:#133#.
字符串:133
2、lstrip()方法
lstrip()方法可以去除字符串左側的空格和特殊字符,
語法格式
str.lstrip([chars])
3、rstrip()方法
rstrip()方法可以去除字符串由右側的空格和特殊字符,
語法格式
str.rstrip([chars])
1.8、格式化字符串
格式化字符串就是先定義一個模板,然後在模板中留幾個空位,空位用佔位符來標記
1、使用%號操作符(逐漸沒落)
常用的格式化字符
格式化字符 | 說明 | 格式化字符 | 說明 |
---|---|---|---|
%s | 字符串(採用str顯示) | %r | 字符串(採用repr顯示) |
%c | 單個字符 | %o | 八進制整數 |
%d或者%i | 十進制整數 | %e | 指數(基地寫爲e) |
%x | 16進制整數 | %E | 指數(基地寫爲E) |
%f或者%F | 浮點數 | %% | 字符% |
如
a = "小明爲莆田%d中學生,學號爲%d,同學都叫他%s" # 定義模板
b1 = (6, 31111111, '小明') # 定義與轉化的內容
print(a % b1) # 格式化輸出
輸出
小明爲莆田6中學生,學號爲31111111,同學都叫他小明
2、使用字符串對象的format()方法(推薦使用)
語法格式
str.format(args)
args用於指定與轉化的項
format()方法中常用的格式化字符
s | 對字符串類型進行格式化 |
---|---|
b | 將十進制數自動轉換成二進制數表示再格式化 |
d | 十進制整數 |
o | 將十進制數自動轉換成八進制數表示再格式化 |
c | 將十進制數自動轉換成對應的unicode字符 |
x 或者 X | 將十進制數自動轉換成十六進制數表示再格式化 |
e或者E | 轉化爲科學計數法表示再格式化 |
f或者F | 轉化爲浮點數(默認小數點後保留6位)再格式化 |
g或者G | 自動在e和f或者E和F中切換 |
% | 顯示百分比(默認小數點後保留6位) |
如
a = "小明爲莆田{:d}中學生,學號爲{:0>7d},同學都叫他{:s}" # 定義模板
b1 = a.format(6, 31111111, '小明') # 定義與轉化的內容
print(b1) # 格式化輸出
輸出
小明爲莆田6中學生,學號爲31111111,同學都叫他小明
2、正則表達式基礎
2.1、行定位符
行定位符就是用來描述字符串的邊界。“^”表示行的開始,“$”表示行的結尾
如
^tm$
2.2、常用的元字符
代碼 | 說明 |
---|---|
. | 匹配除換行符以外的任意字符 |
\w | 匹配字母數字、下劃線或者漢字 |
\s | 匹配任意的空格符 |
\d | 匹配數字 |
\b | 匹配單詞的開始或者結束 |
^ | |
$ | 匹配字符串的結尾 |
2.3、限定符
如匹配8位QQ號碼可以使用下面的方式表示
^\d{8}$
常用的限定符
限定符 | 說明 | 舉例 |
---|---|---|
? | 匹配前面的字符零次或者一次 | app?le,該表達式可以匹配apple或者aple |
+ | 匹配前面的字符者一次或多次 | app+le,該表達式可以匹配apple到app…le |
* | 匹配前面的字符者零次或多次 | app*le,該表達式可以匹配aple到app…le |
{n} | 匹配前面的字符者n次 | app{2}le,該表達式可以匹配appple |
{n,} | 匹配前面的字符者最少n次 | app{2,}le,該表達式可以匹配appple到appp…le |
{n,m} | 匹配前面的字符者最少n次,最多m次 | app{2,3}le,該表達式可以匹配appple或者apppple |
2.4、字符類
如果匹配沒有預定義的元字符的字符集合(比如元音字母a,e,i,o,u)我們可以使用方括號,然後把要匹配的內容寫在方括號裏,如[aeiou]匹配任何一個元音字母。
[0-9]與\d的效果一樣
[a-z0-9A-Z]與\w的效果一樣(只考慮英文)
[\u4e00-\u9fa5]匹配給定字符串的任意一個漢字,匹配連續多個漢字[\u4e00-\u9fa5]+
2.5、排除字符
把^放在方括號裏就是排除的意思
如
[^a-zA-Z]
該表達式用於匹配一個不是字母的字符串
2.6、選擇字符
例子,匹配身份證號碼
身份證號碼爲15位或者18位,如果是15位的全爲數字,如果是17位,則最後一位是效驗位,爲數字或者X(x)
可以使用下面表達式匹配
^\d{15})|(^\d{18}) |(^\d{17} (\d|X|x)$
意思是匹配15位或者18位數字或者17位數字和最後一位是數字或者X或者x
2.7、轉義字符
正則表達式中的轉義字符也是將特殊字符(“.”、“?”,“\”)變爲普通的字符
。如用正則表達式表示127.0.0.1這樣格式的IP地址
[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
注意括號在正則表達式也算一個字符
2.8、分組
例子
(thir|four)th
意思是匹配單詞thirth或者fourth,如果不使用小括號,就變成了匹配單詞thir和fourth
小括號的第二個作用就是分組。
如
(\.[1-9]{1,3}){2},就是對(\.[1-9]{1,3})進行操作
2.9、在python中使用正則表達式語法
在Python中使用正則表達式就是將其作爲模式字符串使用的。
將匹配以m開頭的正則表達式轉化爲模式字符串
'\\bm\\w*\\b'
因爲模式字符串可能包含大量的特殊字符和斜槓,所以需要使用原生字符串
就是在模式字符串前加上r或者R.
如
r ‘\bm\w*\b’
3、使用re模塊實現正則表達式操作
3.1、匹配字符串
1.使用match()方法進行匹配
如果在其實位置匹配成功,則返回Match對象,否則返回None,其語法格式如下:
re.match(pattern,string,[flags])
說明
pattern:表示模式字符串,由要匹配的正則表達式轉換而來
string:表示要匹配的字符串
flags:可選參數,表示標識位,用於控制匹配方式,如是否區分字母大小寫。
常用的標誌如下表所示
標誌 | 說明 |
---|---|
A或ASCII | 對\w、\W、\b、\B、\d、\D、\s、\S只進行ASCII匹配(只適用Python3.x) |
I或ICNORECASE | 執行不按字母大小寫匹配 |
M或MULTLINE | 將^和$用於包括整個字符串的開始和結尾的每一行 |
S或DOTALL | 使用“.”字符匹配所有字符,包括換行符 |
X或VERBOSE | 忽略模式字符串中爲轉義的空格和註釋 |
如
import re
pattern = r'mr_\w+' # 模式字符串
string = 'MR_SHOP mr_shop' # 要匹配的字符串
match = re.match(pattern, string,re.I) # 匹配字符串不區分大小寫
print("匹配值的起始位置:", match.start())
print("匹配值的結束位置:", match.end())
print("匹配位置的元組:", match.span())
print("要匹配的字符串:", match.string)
print("匹配數據", match.group())
輸出
匹配值的起始位置: 0
匹配值的結束位置: 7
匹配位置的元組: (0, 7)
要匹配的字符串: MR_SHOP mr_shop
匹配數據 MR_SHOP
2、使用search()方法進行匹配
search()方法用於在整個字符串的搜索第一個匹配的值,如果在匹配成功返回match對象,否則返回None
語法格式
re.search(pattern,string,[flags])
參數說明參考match方法
3、使用findall()方法進行匹配
findall方法主要用於整個字符串中搜索所有符合正則表達式的字符串,並以列表的形式返回。如果匹配成功返回包含匹配結構的列表,否則返回空列表。
語法格式
re.findall(pattern,string,[flags])
參數說明參考match方法
如
import re
pattern = r'([1-9]{1,3}(\.[0-9]{1,3}){3})'
str1 = '127.0.0.1 192.168.122.2'
match = re.findall(pattern, str1)
for i in match:
print(i[0])
輸出
127.0.0.1
192.168.122.2
3.2、替換字符
使用sub()方法進行字符串替換
語法格式
re.sub(pattern, repl, string, count, flags)
說明
pattern:表示模式字符串
repl:表示替換的字符串
string:表示要被查找替換的原始字符串
count: 可選參數表示模式匹配後替換的最大次數,默認爲0表示替換所有的匹配
flags: 可選參數,表示標誌位,用於控制匹配方式,如區分大小寫等,參考match()方法
例子
import re
pattern = r'1[34578]\d{9}'
string = '中獎號碼爲:84795643 聯繫電話爲:13611111111'
result = re.sub(pattern, '1xxxxxxxxxx', string)
print(result)
輸出
中獎號碼爲:84795643 聯繫電話爲:1xxxxxxxxxx
3.3、使用正則表達式分隔字符串
split()方法進行分隔字符串,並以列表形式返回
語法格式
re.split(pattern, string, [maxsplit], [flags])
說明
pattern:表示模式字符串
string:表示要匹配的字符串
maxsplit: 可選參數,表示最大的拆分次數
flags: 可選參數,表示標誌位,用於控制匹配方式,如區分大小寫等,參考match()方法
例子
import re
pattern = r'[?|&]'
url = 'http://www.baidu.com?a=xxx&b=yyyy'
result = re.split(pattern, url)
print(result)
輸出
['http://www.baidu.com', 'a=xxx', 'b=yyyy']
4、牛刀小試
4.1、按要求輸出字符串
已知字符串word=“aS98hdkHFSWEas754”,.編寫一- 個程序,分別實現如下功能:
●請將word字符串中的大寫字母改爲小寫字母,小寫字母改爲大寫字母,
●請將word字符串中的數字取出,並輸出成一 一個新的字符串
普通版:
word = "aS98hdkHFSWEas754"
a = ""
b = ""
for i in word:
if 97 <= ord(i) <= 122: # 小寫字母變大寫
a = a + i.upper()
elif 65 <= ord(i) <= 90: # 大寫字母變小寫
a = a + i.lower()
else:
a = a + i # 數字不變
b = b + i # 數字取出,組成新的字符串
word = a
print(word)
print(b)
升級版:
word = "aS98hdkHFSWEas754"
word = word.swapcase() # word字符串中的大寫字母改爲小寫字母,小寫字母改爲大寫字母
b = ""
for i in word:
if '0'<=i <='9':
b = b + i # 數字取出,組成一個新的字符串
print(word)
print(b)
4.2、輸出生日信息
張三的身份證號碼是“210011196809210451”.請提取張三的生日信息並輸出。
前置知識,身份證的第七位到第14位是出生日期,11位到14位是生日
number = "210011196809210451"
birthday = '張三的生日爲:{:s}月{:s}日' # 定義模塊化字符串
print(birthday.format(number[10:12], number[12:14])) # 使用format方法輸出張三生日
4.3、不重複字母
已知字符串word=“ABDPISDNGDA”.請去除word字符串多次出現的字母,僅留最先出現的一個。例如aabc經過去除後,輸出abc。
b =""
word="ABDPISDNGDA"
for i in word:
if i not in b:
b += i
print(b)
4.4、英文句子倒敘輸出
將一句英文句於單詞順序留序輸出,但是不改變單詞結構。例如: 1 am a beautiful ginl,輸出爲girl beautiful a am I
a = input("請輸入英文句子:")
b = a.split() # 將字符串按空格分開,生產一個列表
c = ""
for index, item in enumerate(b): # 利用索引倒敘輸出列表的值,並拼接爲字符串
c = c + b[-1 - index] + " "
print(c)
輸出
請輸入英文句子:You are a beautiful girl
girl beautiful a are You