python字符串詳解
字符串
字符串或串(String)是由數字、字母、下劃線組成的一串字符。一般記爲 s=“a1a2···an”(n>=0)。它是編程語言中表示文本的數據類型。 通常以串的整體作爲操作對象,如:在串中查找某個子串、求取一個子串、在串的某個位置上插入一個子串以及刪除一個子串等。兩個字符串相等的充要條件是:長度相等,並且各個對應位置上的字符都相等。
屬於python基本數據類型和結構的一種。2 本身是不可變的數據類型。 3 有很多內置的方法
字符串是 Python 中最常用的數據類型。我們可以使用引號('或")來創建字符串。
var1 = 'Hello World!'
var2 = "I love Python "
字符串基本操作
1.Python訪問字符串中的值
索引和切片
Python不支持單字符類型,單字符在 Python 中也是作爲一個字符串使用。
Python訪問子字符串,可以使用方括號來截取字符串.,當方括號中有三個參數,第三個代表步長(間隔)。
print ("var1[0]: ", , var1[0])
print ("var2[1:5]: ",, var2[1:5])
a ='123456789'
a[0:9:3]#從零到九,間隔三個取一個形成新的字符串。
# var1[0]: H
# love
下面這個代碼是針對上面切片和索引歸納的幾個實例
str = 'Hello World!'
print (str) # 輸出完整字符串
print (str[0] )# 輸出字符串中的第一個字符
print (str[2:5]) # 輸出字符串中第三個至第五個之間的字符串,操作: str[star:end:sep]
print (str[2:] )# 輸出從第三個字符開始的字符串
print (str * 2) # 輸出字符串兩次
print( str + "TEST" )# 輸出連接的字符串
2.你可以對已存在的字符串進行修改,並賦值給另一個變量
var1 = 'Hello World!'
print( "更新字符串 :- ", var1[:6] + 'Runoob!')
## 運行結果:更新字符串 :- Hello Runoob!
3.Python字符串格式化和原始字符串
- Python 支持格式化字符串的輸出 。儘管這樣可能會用到非常複雜的表達式,但最基本的用法是將一個值插入到一個有字符串格式符 %s 的字符串中。
在 Python 中,字符串格式化使用與 C 中 sprintf 函數一樣的語法。
print ("My name is %s and weight is %d kg!" % ('Zara', 21)) # 注意雙引號後還要加一個%
## 運行結果My name is Zara and weight is 21 kg!
- python字符串格式化符號:
符 號 描述
%c 格式化字符及其ASCII碼
%s 格式化字符串
%d 格式化整數
%u 格式化無符號整型
%o 格式化無符號八進制數
%x 格式化無符號十六進制數
%X 格式化無符號十六進制數(大寫)
%f 格式化浮點數字,可指定小數點後的精度
%e 用科學計數法格式化浮點數
%E 作用同%e,用科學計數法格式化浮點數
%g %f和%e的簡寫
%G %f 和 %E 的簡寫
%p 用十六進制數格式化變量的地址
- Python轉義字符:
轉義字符 描述
\(在行尾時) 續行符
\\ 反斜槓符號
\' 單引號
\" 雙引號
\a 響鈴
\b 退格(Backspace)
\e 轉義
\000 空
\n 換行
\v 縱向製表符
\t 橫向製表符
\r 回車
\f 換頁
\oyy 八進制數,yy代表的字符,例如:\o12代表換行
\xyy 十六進制數,yy代表的字符,例如:\x0a代表換行
\other 其它的字符以普通格式輸出
- python 中的原始字符串
原始字符串:所有的字符串都是直接按照字面的意思來使用,沒有轉義特殊或不能打印的字符。
在Python中爲了使反斜槓和元字符取消字符的特殊功能,需要在字符前添加反斜槓。
解決的辦法就是爲正則表達式使用 python 的 raw 字符串表示;在字符串前加個 “r” 反斜槓就不會被任何特殊方式處理,所以 r”\n” 就是包含”\” 和 “n” 的兩個字符,而 “\n” 則是一個字符,表示一個換行。正則表達式通常在 Python 代碼中都是用這種 raw 字符串表示。
原始字符串除在字符串的第一個引號前加上字母“r”(可以大小寫)以外,與普通字符串有着幾乎完全相同的語法。
>>> '\n'
'\n'
>>> print( '\n')
>>> r'\n'
'\\n'
>>> print (r'\n')
\n
使用原始字符串,可以讓我們減少錯誤。
如下例子中,打開readme.txt時出現異常,就是因爲’\r’和’\t’被當成不在我們的文件名中的特殊字符。這個在讀取文件路徑很有用。
>>> f = open("D:\windows\temp\readme.txt",'r')
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
f = open("D:\windows\temp\readme.txt",'r')
IOError: [Errno 22] invalid mode ('r') or filename: 'D:\\windows\temp\readme.txt'
4.字符串連接
+直接連接字符串,當字符比較多的時候,效率是比較低的。
a = ['a','b','c','d']
content = ''
for i in a:
content = content + i
print (content)
說下爲什麼效率會低呢?
原因:在循環連接字符串的時候,他每次連接一次,就要重新開闢空間,然後把字符串連接起來,再放入新的空間,再一次循環,又要開闢新的空間,把字符串連接起來放入新的空間,如此反覆,內存操作比較頻繁,每次都要計算內存空間,然後開闢內存空間,再釋放內存空間,效率非常低,你也許操作比較少的數據的時候看不出來,感覺影響不大,但是你碰到操作數據量比較多的時候,這個方法就要退休了。
- 方法1: 用字符串的join方法
a = ['a','b','c','d']
content = ''
content = ''.join(a)
print (content)
- 用字符串的替換佔位符替換
這裏不詳細介紹,有興趣可以看字符串拼接的相關知識。
5.字符串替換
字符串替換可以用內置的方法和正則表達式完成。
1)用字符串本身的replace方法:
2)用正則表達式來完成替換:
a = 'hello word'
#我把a字符串裏的word替換爲python
#用字符串本身的replace方法
a.replace('word','python')
#用正則表達式來完成替換:
import re 用正則表達式
strinfo = re.compile('word')
b = strinfo.sub('python',a)
6.字符串比較
cmp方法比較兩個對象,並根據結果返回一個整數。cmp(x,y)如果X< Y,返回值是負數 如果X>Y 返回的值爲正數。
7.字符串查找
python 字符串查找有4個方法,1 find,2 index方法,3 rfind方法,4 rindex方法。
1 find()方法:
2 index()方法:
python 的index方法是在字符串裏查找子串第一次出現的位置,類似字符串的find方法,不過比find方法更好的是,如果查找不到子串,會拋出異常,而不是返回-1
8.字符串分割
字符串分割,可以用split,rsplit方法,通過相應的規則來切割成生成列表對象。
9.字符串翻轉
通過步進反轉[::-1]
a ='hello'
b = a[::-1]
10.字符串編碼
通過字符串的decode和encode方法
encode([encoding,[errors]])
其中encoding可以有多種值,比如gb2312 gbk gb18030 bz2 zlib big5 bzse64等都支持。errors默認值爲"strict",意思是UnicodeError。可能的值還有’ignore’, ‘replace’, ‘xmlcharrefreplace’, ‘backslashreplace’ 和所有的通過codecs.register_error註冊的值。
11.字符串長度
通過內置方法len()來計算字符串的長度,注意這個計算的是字符的長度。
a ='hello'
len(a)#5
字符串函數操作
1.字符串大小寫
通過下面的upper(),lower()等方法來轉換大小寫
S.upper()#S中的字母大寫
S.lower() #S中的字母小寫
S.capitalize() #首字母大寫
S.istitle() #S是否是首字母大寫的
S.isupper() #S中的字母是否便是大寫
S.islower() #S中的字母是否全是小寫
2.字符串去空格
通過strip(),lstrip(),rstrip()方法去除字符串的空格
S.strip()去掉字符串的左右空格
S.lstrip()去掉字符串的左邊空格
S.rstrip()去掉字符串的右邊空格
3.字符串常用函數總結
string = '2121ddqweq'
# 把字符串的第一個字符大寫
string.capitalize()
#返回一個原字符串居中,並使用空格填充至長度 width 的新字符串
string.center(width)
#返回 str 在 string 裏面出現的次數,如果 beg 或者 end 指定則返回指定範圍內 str 出現的次數
string.count(str, beg=0, end=len(string))
#以 encoding 指定的編碼格式解碼 string,如果出錯默認報一個 ValueError 的 異 常 ,
#除 非 errors 指 定 的 是 'ignore' 或 者'replace'
string.decode(encoding='UTF-8', errors='strict')
#以 encoding 指定的編碼格式編碼 string,如果出錯默認報一個ValueError 的異常,
#除非 errors 指定的是'ignore'或者'replace'
string.encode(encoding='UTF-8', errors='strict')
#檢查字符串是否以 obj 結束,如果beg 或者 end 指定則檢查指定的範圍內是否以 obj 結束,如果是,
#返回 True,否則返回 False.
string.endswith(obj, beg=0, end=len(string))
#把字符串 string 中的 tab 符號轉爲空格,tab 符號默認的空格數是 8。
string.expandtabs(tabsize=8)
#檢測 str 是否包含在 string 中,如果 beg 和 end 指定範圍,則檢查是否包含在指定範圍內,
#如果是返回開始的索引值,否則返回-1
string.find(str, beg=0, end=len(string))
#跟find()方法一樣,檢測 str 是否包含在 string 中,只不過如果str不在 string中會報一個異常.
string.index(str, beg=0, end=len(string))
#如果 string 至少有一個字符並且所有字符都是字母或數字則返回 True,否則返回 False
string.isalnum()
#如果 string 至少有一個字符並且所有字符都是字母則返回 True,否則返回 False
string.isalpha()
#如果 string 只包含十進制數字則返回 True 否則返回 False.
string.isdecimal()
#如果 string 只包含數字則返回 True 否則返回 False.
string.isdigit()
#如果 string 中包含至少一個區分大小寫的字符,並且所有這些(區分大小寫的)字符都是小寫,
#則返回 True,否則返回 False
string.islower()
#如果 string 中只包含數字字符,則返回 True,否則返回 False
string.isnumeric()
#如果 string 中只包含空格,則返回 True,否則返回 False.
string.isspace()
#如果 string 是標題化的(見 title())則返回 True,否則返回 False
string.istitle()
#如果 string 中包含至少一個區分大小寫的字符,並且所有這些(區分大小寫的)字符都是大寫,
#則返回 True,否則返回 False
string.isupper()
#以 string 作爲分隔符,將 seq(元素序列)中所有的元素合併爲一個新的字符串
string.join(seq)
#返回一個原字符串左對齊,並使用空格填充至長度 width 的新字符串
string.ljust(width)
#轉換 string 中所有大寫字符爲小寫.
string.lower()
#截掉 string 左邊的空格
string.lstrip()
#maketrans() 方法用於創建字符映射的轉換表,對於接受兩個參數的最簡單的調用方式,第一個參數是字符串,
#表示需要轉換的字符,第二個參數也是字符串表示轉換的目標。
string.maketrans(intab, outtab])
#返回字符串 str 中最大的字母。
max(str)
#返回字符串 str 中最小的字母。
min(str)
#有點像 find()和 split()的結合體,從 str 出現的第一個位置起,把 字 符 串 string 分 成
# 一 個 3 元 素 的 元 組 (string_pre_str,str,string_post_str),如果 string 中
#不包含str 則 string_pre_str == string.
string.partition(str)
#把 string 中的 str1 替換成 str2,如果 num 指定,則替換不超過 num 次.
string.replace(str1, str2, num=string.count(str1))
#類似於 find()函數,不過是從右邊開始查找.
string.rfind(str, beg=0,end=len(string) )
#類似於 index(),不過是從右邊開始.
string.rindex( str, beg=0,end=len(string))
#返回一個原字符串右對齊,並使用空格填充至長度 width 的新字符串
string.rjust(width)
#類似於 partition()函數,不過是從右邊開始查找.
string.rpartition(str)
#刪除 string 字符串末尾的空格.
string.rstrip()
#以 str 爲分隔符切片 string爲字符串列表,如果 num有指定值,則僅分隔 num 個子字符串
string.split(str="", num=string.count(str))
#按照行分隔,返回一個包含各行作爲元素的列表,如果 num 指定則僅切片 num 個行.
string.splitlines(num=string.count('\n'))
#檢查字符串是否是以 obj 開頭,是則返回 True,否則返回 False。如果beg 和 end 指定值,
#則在指定範圍內檢查.
string.startswith(obj, beg=0,end=len(string))
#在 string 上執行 lstrip()和 rstrip()
string.strip([obj])
#翻轉 string 中的大小寫
string.swapcase()
#返回"標題化"的 string,就是說所有單詞都是以大寫開始,其餘字母均爲小寫(見 istitle())
string.title()
#根據 str 給出的表(包含 256 個字符)轉換 string 的字符,要過濾掉的字符放到 del 參數中
string.translate(str, del="")
#轉換 string 中的小寫字母爲大寫
string.upper()
#返回長度爲 width 的字符串,原字符串 string 右對齊,前面填充0
string.zfill(width)
#檢查字符串是否只包含十進制字符。這種方法只存在於unicode對象。
string.isdecimal()
上面的函數參考了幾篇博主的文章,大家有興趣可以去這個幾個博客上面看一下。
Python 字符串詳解1
python 字符串詳解2