返回目錄html
Python3中,字符串全都用Unicode形式,因此省去了不少之前各類轉換與聲明的麻煩。字符串屬於序列,全部序列可用的方法(好比切片等)均可用於字符串。git
注意:字符串屬於不可變序列,全部處理修改字符的方法,都會生成一個新字符串返回,原字符串不會變。正則表達式
字符串方法 | 簡述 | 舉例或說明 | |
---|---|---|---|
字符串內容檢查 | |||
s.isalpha() | 是否全部字符都爲字母 | 'abc'.isalpha() # 結果爲 Trueapi |
|
s.islower() | 字符串中字母是否都爲小寫(無視其中的非字母字符) | 'abc'.islower() # 結果爲 True緩存 |
|
s.isupper() | 字符串中字母是否都爲大寫(無視其中的非字母字符) | 'ABC'.isupper() # 結果爲 Trueapp |
|
s.isdecimal() | 是否全部字符都爲數字0~9(小數點和正負號視做非數字) | '123'.isdedimal() # 結果爲 Trueide |
|
s.isdigit() | 是否全部字符都爲:數字0~九、羅馬數字(小數點和正負號視做非數字) | 'Ⅳ'.isdigit() # 結果爲 True函數 |
|
s.isnumeric() | 是否全部字符都爲:數字0~九、羅馬數字、漢字數字(小數點和正負號視做非數字) | '一百'.isnumeric() # 結果爲 Trueui |
|
s.isalnum() | 是否全部字符都爲字母或數字 | 'abc123'.isalnum() # 結果爲 True編碼 |
|
s.isspace() | 是否全部字符都爲空白 | ' \t '.isspace() # 結果爲 True |
|
s.isprintable() | 是否全部字符均可打印。 | 'a\t'.isprintable() # 結果爲 False |
|
s.isascii() | 是否全部字符都爲ascii碼範圍內字符 | 'a1#'.isascii() # 結果爲 True |
|
s.istitle() | 是否字符串中每一個單詞首字母都爲大寫(若單詞首字符爲非字母字符,則判斷第2個字符,以此類推) | 'Ab 2Cc'.istitle() # 結果爲 True |
|
s.isidentifier() | 字符串內容是否爲Python保留字 | 'if'.isidentifier() # 結果爲 True |
|
子串查找與判斷 | |||
s.startswith(prefix [,start [,end]]) | 檢查字符串是否以prefix開頭,start, end爲查找範圍(用法同切片)。 | 'abc'.startswith('ab') # 結果爲 True |
|
s.endswith(suffix [,start [,end]]) | 檢查字符串是否以suffix結尾,start, end爲查找範圍(用法同切片)。 | 'abc'.endswith('b') # 結果爲 False 'abc'.endswith('b',0,2) # 結果爲 True |
|
s.find(sub [,start [,end]]) | 查找指定字符串sub首次出現的位置,若沒找到則返回-1。start, end爲查找範圍(用法同切片)。 | 'abcabc'.find('bc') # 結果爲 1 |
|
s.rfind(sub [,start [,end]]) | 查找指定字符串sub最後一次出現的位置,若沒找到則返回-1,start, end用法同上。 | 'abcabc'.rfind('bc') # 結果爲 4 |
|
s.index(sub [,start [,end]]) | 功能同s.find(),區別是沒找到時引起ValueError錯誤。 | 'abcabc'.index('bc') # 結果爲 1 |
|
s.rindex(sub [,start [,end]]) | 功能同s.rfind(),區別是沒找到時引起ValueError錯誤。 | 'abcabc'.index('bc') # 結果爲 4 |
|
s.count(sub [,start [,end]]) | 統計指定子字符串sub出現的次數,start和end爲查找範圍(用法同切片)。 | 'abc'.count('b',1,1) # 結果爲 0 'abc'.count('b',1,2) # 結果爲 1 |
|
字符串修改 | |||
s.lower() | 返回新字符串,內容爲將原字符串中字母全轉成小寫(非字母字符則不變) | 'A1B2'.lower() # 返回爲 'a1b2' |
|
s.upper() | 返回新字符串,內容爲將原字符串中字母全轉成大寫(非字母字符則不變) | 'a1b2'.upper() # 返回爲 'A1B2' |
|
s.swapcase() | 返回新字符串,內容爲將原字符串中字母大小寫互換(非字母字符則不變) | 'abCD'.swapcase() # 返回爲 'ABcd' |
|
s.capitalize() | 返回新字符串,內容爲將原字符串中每一個單詞的首字母變爲大寫。 | 'ab cd'.capitalize() # 返回爲 'Ab Cd; |
|
s.expandtabs(tabsize=8) | 返回新字符串,內容用空格替換製表符,入參爲tab對應的空格數。 | a\tb'.expandtabs(4) # 返回爲 'a b' |
|
s.replace(old, new [,count]) | 返回新字符串,內容爲用new替換原字符串中old內容,count可指定替換次數(默認爲所有替換) | 'abcdab'.replace('ab','xy') # 返回爲 'xycdxy' |
|
字符串格式簡單處理 | |||
s.strip([chars]) | 返回新字符串,內容爲刪掉原字符串中兩邊的空白。若指定入參chars,則爲刪掉原字符串兩端在入參chars中出現的字符。 | ' abc '.strip() # 返回爲 'abc' 'www.xyz.com'.strip('.cwom') # 返回爲 'xyz' |
|
s.lstrip([chars]) | 用法同上,不過僅處理字符串的左邊。 | 'www.xyz.com'.lstrip('.cwom') # 返回爲 'xyz.com' |
|
s.rstrip([chars]) | 用法同上,不過僅處理字符串的右邊。 | 'www.xyz.com'.rstrip('.cwom') # 返回爲 www.xyz' |
|
s.center(width [,fillchar]) | 返回新字符串,在長度爲width的寬度內將原字符串居中,fillchar爲填充單字符 | 'abc'.center(9,'*') # 返回爲 '***abc***' |
|
s.ljust(width [,fillchar]) | 返回新字符串,在長度爲width的寬度內將原字符串靠左對齊,fillchar爲填充單字符 | 'abc'.ljust(9,'*') # 返回爲 'abc******' |
|
s.rjust(width [,fillchar]) | 返回新字符串,在長度爲width的寬度內將原字符串靠右對齊,fillchar爲填充單字符 | 'abc'.rjust(9,'*') # 返回爲 '******abc' |
|
s.zfill(width) | 返回新字符串,在原字符串左邊填充0,直至其寬度爲width | 'abc'.zfill(9) # 返回爲 '000000abc' |
|
s.translate(table) | 字符映射轉換。使用一個轉換表table,將字符串中的某個子串映射成另外一個子串。轉換table由下面的maketrans()方法生成。 | t=str.maketrans({'ab':'cd'}) 'abc'.translate(t) # 返回爲 'cdc'
t2=str.maketrans('ab','xy') 'abc'.translate(t2) # 返回爲 'xyc'
t3=str.maketrans('ab','xy',c) 'abc'.translate(t3) # 返回爲 'xy' |
|
s.maketrans(x [,y [,z]]) | 靜態方法。生成一個供上面translate()方法是用的轉換表,其中原始子串和映射後子串必須長度相同。若只提供一個參數:x必須爲一個字典,鍵名錶示原始子串,值表示映射後子串。若提供2個參數:x表示原始子串,y表示映射後子串。若提供3個參數:x, y含義不變,z表示要刪除的子串。 | ||
完整字符串格式化方法 | |||
s.format(*args, **kwargs) | 字符串格式化方法 | ||
s.format_map(mapping) | Python3.2新增方法,能夠直接使用字典做爲輸入參數進行字符串格式化。 | 比較:format()與format_map() 'Hi {name}!'.format(name='Tom') # 結果爲 'Hi Tom!'
d={'name':'Tom'} 'Hi {name}!'.format_map(d) # 結果爲 'Hi Tom!' |
|
字符串分割與拼接 | |||
s.split(sep=None, maxsplit=-1) | 將字符串以sep做爲分隔符進行劃分,將劃分後的每一個片斷子串排成一個列表返回。maxsplit是劃分的最大次數(默認-1爲不設上限)。若在字符串中沒找到指定分隔符,則將原字符串做爲單一元素放入列表。 | 'a,b,c'.split(',') # 結果爲 ['a','b','c'] |
|
s.rsplit(sep=None, maxsplit=-1) | 用法同上,只不過是從右邊開始劃分字符串,列表中內容的順序仍舊爲從左到右。詳見右例。 | 'a,b,c'.rsplit(',',maxsplit=1) # 結果爲 ['a,b','c'] 'a,b,c'.rsplit(',') # 結果仍爲 ['a','b','c'] |
|
splitlines([keepends]) | 將多行字符串按行進行分隔成列表,若參數keepends爲True,則保留每行後的換行符。 | x="""a b""" x.splitlines() # 結果爲 ['a','b'] x.splitlines(True) # 結果爲 ['a\n','b'] |
|
s.partition(sep) | 用分隔符字符串sep劃分字符串,返回一個元祖(head, sep, tail)。若沒找到sep,則返回(s, "", "") | 'a;b;c'.partition(';') # 結果爲 ('a', ';', 'b;c') |
|
s.rpartition(sep) | 用法同上,只不過是從右邊開始劃分字符串,詳見右例。 | 'a;b;c'.rpartition(';') # 結果爲 ('a;b', ';', 'c') |
|
s.join(iter) | 用s做爲分隔符,將iter中全部迭代對象拼接成一個字符串返回。 | ';'.join('abc') # 結果爲 'a;b;c' ';'.join(['ab','cd']) # 結果爲 'ab;cd' |
|
字符串編碼 | |||
s.encoding(encoding="utf-8", errors="sctrict") | 返回字符串的編碼後字節流版本,返回類型爲bytes。默認爲嚴格檢錯模式,只要在轉換過程當中發現錯誤,即引起UnicodeError錯誤。 | 經常使用的encoding參數: 'ascii'、'utf-16'、'utf-32'、 'gb2312'(國標)、 'gbk' (gb2312的超集) |
string模塊包含不少有用的常量,詳見下表:
常量 | 簡述 |
---|---|
string.digits | 字符串 '0123456789' |
string.octdigits | 字符串 '01234567' |
string.hexdigits | 字符串 '0123456789abcdefABCDEF' |
string.ascii_lowercase | 字符串 'abcdefghijklmnopqrstuvwxyz' |
string.ascii_uppercase | 字符串 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' |
string.ascii_letters | 字符串 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' |
string.punctuation | 由ASCII標點符號字符組成的字符串 |
string.whitespace | 包括:空格、製表符(\t)、換行(\n)、回車(\r)、垂直製表符(\v)、換頁(\f) |
string.printable | 可打印字符組成的字符串,是digits, ascii_letters, punctuation, whitespace的組合 |
string模塊的Template類型也能夠進行簡單的「字符串格式化」。用法以下:
(1)生成一個Template對象(其中用$表示之後將要代入的變量);
(2)對此對象調用substitute(m [,**kwargs])方法,將數據傳入並生成格式化後的字符串。 能夠用字典m來傳入數據,也能夠用後面關鍵字參數**kwargs的方法傳入數據。
詳見下例:
>>> t=string.Template('$name is $age') # 生成Template類型的對象實例t >>> t.substitute({'name':'Tom', 'age':6}) # 用字典傳入數據,結果爲 'Tom is 6' >>> t.substitute(name='Tom', age=6) # 用關鍵字參數傳入數據,結果同上
還能夠用它的template屬性來查看原始字符串:
>>> print(t.template) # 結果爲:'$name is $age'
Python的re模塊用於正則表達式。可使用re模塊的方法直接進行正則表達式的匹配和替換,也能夠將正則表達式先編譯成一個「正則表達式對象」,而後再使用這個正則表達式對象的方法進行字符串匹配和替換,下面咱們分別進行介紹。
另外,因爲正則表達式中大量使用特殊字符和反斜槓,因此正則表達式一般都寫爲「原始字符串」(即在字符串前加上字母r),原始字符串中,全部的特殊字符不會被轉義,如「r'\nabc'前面的'\n'不會被解釋爲換行符,僅僅就是字面意思的斜槓和n。
本篇僅介紹re模塊的用法,關於正則表達式自己的詳細語法,可點擊查看這裏:《正則表達式用法簡介與速查》。
● re模塊的直接方法
使用下面的方法需先:import re
方法 | 簡述 | 舉例或說明 |
---|---|---|
re.compile(patt, flags=0) | 將入參patt編譯爲「正則表達式對象」, flag含義詳見下述 | 關於正則表達式對象的用法 詳見下述。 |
re.escape(string) | 返回一個字符串,其中全部與正則表達式相關的特殊字符前都帶有反斜槓。 | re.escape('ab12[]') # 返回爲 'ab12\[\] |
re.findall(patt, string, flags=0) | 在 string 中匹配 patt,匹配結果用一列表返回。 flag含義詳見下述 | re.findall('\d', 'a12b2') # 結果爲 ['1','2','2'] |
re.finditer(patt, string, flags=0) | 與上面 findall()的用法相同(在string 中匹配 patt),但返回一個含MatchObject類型的迭代器對象。 MatchObject詳見下述。 | re.finditer('\d', 'a12b2') # 結果爲一個MatchObject類型的迭代器 |
re.search(patt, string, flags=0) | 與上面 finditer()的用法相同(在string 中匹配 patt),但僅返回第一個匹配的MatchObject對象,若未找到匹配則返回None。 MatchObject詳見下述。 | m=re.search('\d', 'a12b2') print(m.group(0)) # 結果爲 '1' |
re.match(patt, string, flags=0) | 與上面 search()的用法相同(在string 中匹配 patt,僅返回第一個匹配的MathchObject對象),但僅匹配string的開頭部分。 MatchObject詳見下述。 | re.match('\d', 'a12') # 結果爲 None re.match('\d', '21a') # 結果爲有匹配 |
re.split(patt, string, maxsplit=0, flags=0) | 根據patt出現的位置拆分string,返回字符串列表。maxsplit爲最大拆分次數,其餘參數含義同上。 | re.split('\d', 'a1b23c4') # 結果爲 ['a','b','','c',''] |
re.sub(patt, repl, string, count=0, flags=0) | 使用替換值repl替換string中的patt匹配處內容,返回替換後的新字符串。count是執行替換的最大次數,其餘參數含義同上。 | re.sub('\d','x','a1b23c') # 結果爲 'axxbxc' |
re.subn(patt, repl, string, count=0, flags=0) | 與上面 sub()相同(使用替換值repl替換string中的patt匹配處內容),但返回一個元組,其中包含新字符串和替換次數 | re.subn('\d','x','a1b23c') # 結果爲 ('axxbxc', 3) |
re.purge() | 清空正則表達式的緩存內容 | 通常用於含子表達式時的狀況 |
flag標誌:各標誌本質上爲一個整數值,多個標誌同時使用時,中間用「或」運算符合並。
縮寫 | 全稱 | 整數值 | 含義說明 |
---|---|---|---|
re.A | re.ASCII | 256 | 執行僅8位ASCII字符匹配 |
re.I | re.IGNORECASE | 2 | 執行不區分大小寫的匹配 |
re.L | re.LOCALE | 4 | 爲\w、\W、\b、\B 使用地區設置 |
re.M | re.MULTILINE | 8 | 將^和$應用於多行字符串的的每一行(正常狀況下,^和$僅用於匹配整個字符串的開頭和結尾)。 |
re.S | re.DOTALL | 16 | 使點字符「.」匹配全部字符,包括換行符 |
re.U | re.UNICODE | 32 | 使用Unicode(Python3默認標誌) |
re.X | re.VERBOSE | 64 | 忽略模式字符串中未轉義的空格和註釋 |
● 正則表達式對象的使用方法
由re.compile()函數編譯建立的正則表達式對象,具備如下屬性和方法:
屬性或方法 | 簡述 | 舉例或說明 | |
---|---|---|---|
屬性 | |||
flags | 在使用complie編譯正則表達式時使用的flags參數,爲一個整數。 | r=re.compile('a') print(r.flags) # 結果爲 32 |
|
groupindex | 一個字典,對相似(?P<name>...)的擴展正則表達式,將其定義的各符號分組名映射到數字編號。 | r=re.compile('(?P<a1>\d)(?P<a2>abc)') print(r.groupindex) # 結果爲 {'a1':1, 'a2':2} |
|
pattern | 本正則表達式對象在compile()編譯前的原始表達字符串 | 略 |
|
方法 | |||
findall(str [,pos [,endpos]]) | 等效於前面的re.findall()函數(在 string 中匹配本正則對象,匹配結果用一列表返回),pos和endpos指定搜索的開始和結束位置。 | r=re.compile('\d') r.findall('a12b2') # 結果爲 ['1','2','2'] |
|
finditer(str [,pos [,endpos]]) | 等效於前面的re.finditer()函數(在string 中匹配本正則對象,返回一個含MatchObject類型的迭代器對象),pos和endpos含義同上。 | r=re.compile('\d') r.finditer('a12b2') # 結果爲一個MatchObject類型的迭代器 |
|
search(str [,pos [,endpos]]) | 等效於前面的re.search()函數(在string 中匹配本正則對象,但僅返回第一個匹配的MatchObject對象),pos和endpos含義同上。 | r=re.compile('\d') m=r.search('a12b2') print(m.group(0)) # 結果爲 '1' |
|
match(str [,pos [,endpos]]) | 等效於前面的re.match()函數(在string 中匹配本正則對象,僅返回第一個匹配的MathchObject對象,且僅匹配string的開頭部分),pos和endpos含義同上。 | r=re.compile('\d') m=r.match('a12b2') # 結果爲 None |
|
split(str, maxsplit=0) | 等效於前面的re.split()函數(根據本正則對象出現的位置拆分string,返回字符串列表,maxsplit爲最大拆分次數)。 | r=re.compile('\d') r.split('a1b23c4') # 結果爲 ['a','b','','c',''] |
|
sub(repl, str, count=0) | 等效於前面的re.sub()函數(使用替換值repl替換string中的本正則對象匹配處內容,返回替換後的新字符串。count是執行替換的最大次數)。 | r=re.compile('\d') r.sub('x','a1b23c') # 結果爲 'axxbxc' |
|
subn(repl, str, count=0) | 等效於前面的re.subn()函數(使用替換值repl替換string中的本正則對象匹配處內容,返回一個元組,其中包含新字符串和替換次數)。 | r=re.compile('\d') r.subn('x','a1b23c') # 結果爲 ('axxbxc', 3) |
● MatchObject詳解:
MatchObject實例包含若干匹配的完整信息,它具備如下屬性和方法
屬性或方法 | 簡述 | 舉例或說明 | |
---|---|---|---|
屬性 | |||
pos | 傳遞給search()或match()函數的pos值 | 略 |
|
endpos | 傳遞給search()或match()函數的endpos值 | 略 |
|
lastindex | 在使用子表達式時,相匹配的最後一個子表達式的數字索引(從1開始),若沒有匹配的子表達式,則爲None。 | r=re.compile('(a)(b)') m=r.search('abc') print(m.lastindex) # 結果爲 2 # 解釋:第2個子表達式爲'b',有匹配,故最後一個匹配的子表達式的索引爲2 |
|
lastgroup | 在使用子表達式時,相匹配的最後一個子表達式的給定名稱,若是沒有相匹配的子表達式,或正則表達式中沒有給定名稱的子表達式,則爲None。 | r=re.compile('(?P<a1>a)(?P<a2>b)') m=r.search('abc') print(m.lastgroup) # 結果爲 a2 # 解釋:第2個子表達爲'b',有匹配,且第2個子表達式被命名爲'a2',故最後結果顯式爲'a2' |
|
re | 一個正則表達式對象,它的match()或search()方法生成此MatchObject實例。 | r=re.compile('a') m=r.search('abc') print(m.re) # 結果爲 re.compile('a') |
|
string | 傳遞給match()或search()的字符串。 | 略 |
|
方法 | |||
expand(template) | 返回一個字符串,該字符串可經過在字符串template上使用反斜槓來提取出被匹配的內容(若使用子表達數字索引,須要使用雙反斜槓)。 | r=re.compile('(?P<a1>a)(?P<a2>b)') m=r.search('abc') m.expand('\\1') # 結果爲 'a' m.expand('\g<a2>') # 結果爲 'b' |
|
group([grp1, grp2, ...]) | 返回匹配的一個或多個子表達式,參數grp1,grp2,... 爲子表達式的索引或給定名稱。若不指定入參或入參爲0,則返回整個匹配值。 | r=re.compile('(?P<a1>a)(?P<a2>b)') m=r.search('abc') m.group(0) # 結果爲 'ab' m.group(1) # 結果爲 'a' m.group('a2') # 結果爲 'b' m.group(1,'a2') # 結果爲 ('a','b') |
|
[] | Python3.6新增功能,可使用[]操做符來返回匹配的子表達式,數字索引含義同上。 | 續上例 m[0] # 結果爲 'ab' m[1] # 結果爲 'a' m[2] # 結果爲 'b' |
|
start([group]) end([group]) |
這兩個方法返回匹配的子表達式在原字符串中的開始和結束索引(end的含義同切片,爲結束位置的後1個位置)。若不指定group,將使用相匹配的整個字符串。 | 續上例 m.start() # 結果爲 0 m.end() # 結果爲 2 m.start(1) # 結果爲 0 m.start(2) # 結果爲 1 |
|
span([group]) | 返回一個元組,內容爲(m.start([group], m.end([group])) | 續上例 m.span() # 結果爲 (0,2) m.span(1) # 結果爲 (0,1) m.span(2) # 結果爲 (1,2) |
|
groups(default=None) | 返回一個元組,其中每一個元素爲各個子表達式匹配的文本,若某子表達式未找到匹配,則對應元素爲None(若指定入參defalut,則將對應的None元素替換爲defalut) | r=re.compile('(?P<a1>a)(?P<a2>b)?') m=r.search('axy') m.groups() # 結果爲 ('a', None) m.groups('z') # 結果爲 ('a', 'z') |
|
groupdict(default=None) | 返回一個字典,其中包含全部給定名稱的子表達式匹配,default含義同上。 | 續上例 m.groupdict() #結果爲{'a1':'a', 'a2':None} m.groupdict('z') #結果爲{'a1':'a', 'a2':'z'} |