Python從入門到專案實踐
Chapter 7 字串與正則表示式
7.1.2 計算字串的長度
str1 = '人生苦短,我用Python!'
length1 = len(str1)
print("length1: ", length1)
length1: 14
從上面的結果中可以看出,在預設的情況下,通過len()函式計算字串的長度時,不區分英文、數字和漢字,所有字元都認為是一個。
在實際開發時,有時需要獲取字串實際所佔的位元組數,即如果採用UTF-8編碼,漢字佔3個位元組,採用GBK或者GB2312時,漢字佔2個位元組。這時,可以通過使用encode()方法進行編碼後再進行獲取。例如,如果要獲取採用UTF-8編碼的字串的長度,可以使用下面的程式碼:
str2 = '人生苦短,我用Python!'
length2 = len(str2.encode())
print("length2: ", length2)
length2: 28
如果要獲取採用GBK編碼的字串的長度,可以使用下面的程式碼:
str3 = '人生苦短,我用Python!'
length3 = len(str3.encode('gbk'))
print("length3: ", length3)
length3: 21
str4 = '人生苦短,我用Python!'
try:
substr = str4[15]
except IndexError:
print('指定的索引不存在!')
指定的索引不存在!
7.1.4 分割字串
str1 = '明 日 學 院 官 網 >>> www.mingrisoft.com'
print('原字串:', str1)
list1 = str1.split()
list2 = str1.split('>>>')
list3 = str1.split('.')
list4 = str1.split(' ', 4)
print(str(list1) + '\n' + str(list2) + '\n' + str(list3) + '\n' + str(list4))
list5 = str1.split('>')
print(str(list5))
原字串: 明 日 學 院 官 網 >>> www.mingrisoft.com
['明', '日', '學', '院', '官', '網', '>>>', 'www.mingrisoft.com']
['明 日 學 院 官 網 ', ' www.mingrisoft.com']
['明 日 學 院 官 網 >>> www', 'mingrisoft', 'com']
['明', '日', '學', '院', '官 網 >>> www.mingrisoft.com']
['明 日 學 院 官 網 ', '', '', ' www.mingrisoft.com']
7.1.5 檢索字串
1.count()方法
str.count(sub[, start[, end]])
str1 = '@明日科技 @雷軍 @馬斯克'
print('字串“', str1, '”中包括:', str1.count('@'), '個 @ 符號')
字串“ @明日科技 @雷軍 @馬斯克 ”中包括: 3 個 @ 符號
2.find()方法
str.find(sub[, start[, end]])
str1 = '@明日科技 @雷軍 @馬斯克'
print(str1.find('@'))
print(str1.rfind('@'))
0
10
3.index()方法
str.index(sub[, start[, end]])
str1 = '@明日科技 @雷軍 @馬斯克'
print(str1.index('@'))
print(str1.rindex('@'))
print(str1.index('*')) # 丟擲異常
0
10
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-22-d037fee938f0> in <module>()
2 print(str1.index('@'))
3 print(str1.rindex('@'))
----> 4 print(str1.index('*'))
ValueError: substring not found
4.startswith()方法
str.startswith(prefix[, start[, end]])
str1 = '@明日科技 @雷軍 @馬斯克'
print(str1.startswith('@'))
print(str1.startswith('明'))
True
False
5.endswith()方法
str.endswith(suffix[, start[, end]])
str1 = 'http://www.mingrisoft.com'
print(str1.endswith('.com'))
True
7.1.6 字母的大小寫轉換
1.lower()方法
str.lower()
str1 = 'WWW.Mingrisoft.com'
print("原字串:", str1)
print("新字串:", str1.lower())
原字串: WWW.Mingrisoft.com
新字串: www.mingrisoft.com
2.upper()方法
str.upper()
str1 = 'WWW.MingriSoft.com'
print("Original String: ", str1)
print("New String: ", str1.upper())
Original String: WWW.MingriSoft.com
New String: WWW.MINGRISOFT.COM
7.1.7 去除字串中的空格和特殊字元
1.strip()方法
str.strip([chars])
str1 = 'http://www.mingrisoft.com \t\n\r'
print('Original String str1: '+ str1 + '.')
Original String str1: http://www.mingrisoft.com
.
print('New String: ' + str1.strip() + '.')
New String: http://www.mingrisoft.com.
str2 = '@明日科技[email protected]'
print('Original String str2: ' + str2 + '.')
Original String str2: @明日科技[email protected]…
print('New String: ' + str2.strip('@.') + '.')
New String: 明日科技.
2.lstrip()方法
str.lstrip([chars])
3.rstrip()方法
str.rstrip([chars])
7.1.8 格式化字串
1.使用 “%” 操作符
‘%[-][+][0][m][.n]格式化字元’%exp
引數說明:
可選引數,用於指定左對齊,正數前方無符號,負數前面加負號。
可選引數,用於指定右對齊,正數前方加正號,負數前面加負號。
可選引數,表示右對齊,正數前面元符號,負數前面加負號,用0填充空白處(一般與m引數一起使用)。
可選引數,表示佔有寬度。
可選引數,表示小數點後保留的位數。
格式化字元:用於指定型別,其值如下表所示:
格式字元 | 說明 | 格式字元 | 說明 |
---|---|---|---|
%s | 字串(採用str()顯示) | %r | 字串(採用repr()顯示) |
%c | 單個字元 | %o | 八進位制整數 |
%d 或 %i | 十進位制整數 | %e | 指數(基底寫為e) |
%x | 十六進位制整數 | %E | 指數(基底寫為E) |
%f 或 %F | 浮點數 | %% | 字元% |
template = '編號:%09d \t公司名稱: %s \t官網: http://www.%s.com'
context1 = (7, '百度', 'baidu')
context2 = (8, '明日學院', 'mingrisoft')
print(template%context1)
print(template%context2)
編號:000000007 公司名稱: 百度 官網: http://www.baidu.com
編號:000000008 公司名稱: 明日學院 官網: http://www.mingrisoft.com
2.使用字串物件的 format() 方法
str.format(args)
template = '編號: {:0>9s} \t公司名稱: {:s} \t官網: http://www.{:s}.com'
context1 = template.format('3', '百度', 'baidu')
context2 = template.format('4', '明日科技', 'mingrisoft')
print(context1)
print(context2)
編號: 000000003 公司名稱: 百度 官網: http://www.baidu.com
編號: 000000004 公司名稱: 明日科技 官網: http://www.mingrisoft.com
7.3 使用 re 模組實現正則表示式操作
7.3.1 匹配字串
re.match(pattern ,string, [flags])
引數說明:
pattern:表示模式字串,由要匹配的正則表示式轉換而來。
string:表示要匹配的字串。
flags:可選引數,表示標誌位,用於控制匹配方式,如是否區分字母大小寫。常用的標誌如下表所示:
標誌 | 說明 |
---|---|
A 或 ASCII | 對於\w、\W、\b、\B、\d、\D、\s 和 \S 只進行 ASCII 匹配 |
I 或 IGNORECASE | 執行不區分字母大小寫的匹配 |
M 或 MULTILINE | 將 ^ 和 $ 用於包括整個字串的開始和結尾的每一行 |
S 或 DOTALL | 使用(.)字元匹配所有字元,包括換行符 |
X 或 VERBOSE | 忽略模式字串中未轉義的空格和註釋 |
import re
pattern = r'mr_\w+'
string = 'MR_SHOP mr_shop'
match = re.match(pattern, string, re.I)
print(match)
string = '專案名稱MR_SHOP mr_shop'
match = re.match(pattern , string, re.I)
print(match)
<_sre.SRE_Match object; span=(0, 7), match=‘MR_SHOP’>
None
import re
pattern = r'mr_\w+'
string = 'MR_SHOP mr_shop'
match = re.match(pattern, string, re.I)
print("Start: ", match.start())
print("End: ", match.end())
print("Location: ", match.span())
print("String: ", match.string)
print("Data: ", match.group())
Start: 0
End: 7
Location: (0, 7)
String: MR_SHOP mr_shop
Data: MR_SHOP