Python知識整合(字符串及正則表達式)

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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章