1. 程式人生 > >Python從入門到專案實踐

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

引數說明:

: &#x27;-&#x27;: 可選引數,用於指定左對齊,正數前方無符號,負數前面加負號。
+ : &#x27;+&#x27;: 可選引數,用於指定右對齊,正數前方加正號,負數前面加負號。
0 : &#x27;0&#x27;: 可選引數,表示右對齊,正數前面元符號,負數前面加負號,用0填充空白處(一般與m引數一起使用)。
m : &#x27;m&#x27;: 可選引數,表示佔有寬度。
. n : &#x27;.n&#x27;: 可選引數,表示小數點後保留的位數。
格式化字元:用於指定型別,其值如下表所示:

格式字元 說明 格式字元 說明
%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