Python中的文本序列類(lèi)型
Python中的文本數(shù)據(jù)由str對(duì)象或字符串進(jìn)行處理。
1.字符串
字符串是Unicode碼值的不可變序列。字符串字面量有多種形式:
- 單引號(hào):'允許嵌入"雙"引號(hào)'
- 雙引號(hào):"允許嵌入'單'引號(hào)"
- 三引號(hào):'''三個(gè)單引號(hào)''', """三個(gè)雙引號(hào)"""
說(shuō)明:
a) 三引號(hào)的字符串可以跨越多行,所關(guān)聯(lián)的空格將包含在字符串文字中;
b) 字符串也可以使用str構(gòu)建函數(shù)從其他對(duì)象創(chuàng)建;
c) 因?yàn)闆](méi)有單獨(dú)的“字符”類(lèi)型,因此索引字符串將產(chǎn)生長(zhǎng)度為1的字符串。也就是說(shuō),對(duì)于非空字符串s,s[0] == s[0:1];
d) 沒(méi)有可變的字符串類(lèi)型,但是str.join()或io.StringIO可以用于從多個(gè)片斷有效地構(gòu)造字符串;
e) 字符串中可以是用反斜線(xiàn)"\"對(duì)特殊字符進(jìn)行轉(zhuǎn)義,也可以在字符串字面上使用"r"前綴來(lái)取消轉(zhuǎn)義;
f) Python 3.3中的修改:為了向后兼容Python 2系列,在字符串字面上再次允許使用"u"前綴,但是它對(duì)字符串文字的含義沒(méi)有影響,也不能與"r"前綴組合使用;
g) 作為單個(gè)表達(dá)式的一部分并且在它們之間只有空格的字符串文字將被隱式轉(zhuǎn)換為單個(gè)字符串文字。也就是說(shuō)("spam""eggs") == "spam eggs";
2.str類(lèi)
str類(lèi)構(gòu)建方法
class str(object='')
class str(object=b'', encoding='utf-8', errors='strict')
str類(lèi)的構(gòu)建方法返回對(duì)象的字符串版本。如果未提供對(duì)象參數(shù),則返回空字符串。 否則,str()的行為取決于是否給出了encoding和errors參數(shù),如下所示:
- 如果既沒(méi)有給出encoding也沒(méi)有給出errors參數(shù),str(object)將會(huì)返回object.__str__()的值,這是object的“非正式”或可打印的字符串表示。對(duì)于字符串對(duì)象,這是字符串本身。如果該object沒(méi)有__str__()方法,那么str()將會(huì)返回repr(object)的結(jié)果值。
- 如果給出了encoding或errors兩個(gè)參數(shù)中的至少一個(gè),則object應(yīng)該是類(lèi)似于字節(jié)的對(duì)象(例如bytes或bytearray)。在這種情況下,如果object是bytes(或 bytearray)對(duì)象,則str(bytes,encoding,errors)等價(jià)于bytes.decode(encoding, errors)。
- 將字節(jié)對(duì)象傳遞給str()而不使用encoding或errors參數(shù)屬于返回非正式字符串表示形式的第一種情況。
str構(gòu)建示例
>>> 'Hello, World!' # 單引號(hào)
'Hello, World!'
>>> "Hello, World!" # 雙引號(hào)
'Hello, World!'
>>> """ # 三引號(hào),多行
... Hello,
... World!
... """
'\nHello,\nWorld!\n'
>>> "Hello, \"World!\"" # 使用轉(zhuǎn)義
'Hello, "World!"'
>>> str() # 不給出object參數(shù),返回空字符串
''
>>> str("Hello, World!") # 給出object參數(shù),但不給出encoding和errors
'Hello, World!'
>>> str(b"Hello, World!")
"b'Hello, World!'"
>>> str(b"Hello, World!", encoding='utf-8') # 給出object參數(shù),也給出encoding參數(shù)
'Hello, World!'
3.文本序列支持的操作
由于文本序列是一個(gè)特殊的(專(zhuān)門(mén)處理文本)不可變序列,因此它不支持可變序列特有的操作,但是它支持所有的序列通用操作。下面介紹下str支持的除序列通用操作外的其他方法:
# 返回一個(gè)將字符串居中的指定長(zhǎng)度的字符串,填充部分使用fillchar指定的字符來(lái)完成(默認(rèn)為ASCII空格)。如果width小于或等于len(s),則返回原始字符串
str.center(width[,fillchar])
# 與center()方法類(lèi)似,只是字符串位于左邊, 填充字符位于右邊
str.ljust(width[,fillchar])
# 與center()方法類(lèi)似,只是字符串位于右邊,填充字符位于左邊
str.rjust(width[,fillchar])
# 在數(shù)字字符串左側(cè)以ASCII的'0'數(shù)字進(jìn)行填充,形成一個(gè)長(zhǎng)度為width的字符串副本,并返回。如果數(shù)字字符串中包含前綴符號(hào)(如 '+'/'-')則'0'會(huì)被插入到前綴字符與數(shù)字字符之間。如果width<=len(s),則返回原始字符串。
str.zfill(width)
# 返回字符串刪除指定的前導(dǎo)字符和尾隨字符之后的副本??蛇x參數(shù)chars是一個(gè)字符串,用來(lái)指定要?jiǎng)h除的字符集合,如果省略或?yàn)镹one則chars參數(shù)默認(rèn)為刪除空格。注意:chars參數(shù)不是前綴或后綴字,相反,它包含的字符的所有組合都會(huì)被刪除。
str.strip([chars])
# 與strip()方法類(lèi)似,只是僅刪除字符串的前導(dǎo)字符
str.lstrip([chars])
# 與strop()方法類(lèi)似,只是僅刪除字符串的尾隨字符
str.rstrip([chars])
# 返回子串sub在切片s[start:end]中第一次出現(xiàn)的索引位置,如果子串sub不存在則返回-1。需要注意的是,只有當(dāng)需要知道sub的位置時(shí),才應(yīng)該使用find()方法,如果要檢查sub是否是字符串的子串,請(qǐng)使用in運(yùn)算符。
str.find(sub[,start[,end]])
# 返回子串sub在切片s[start:end]中最后一次出現(xiàn)的索引位置,如果子串sub存在則返回-1。
str.rfind(sub[, start[, end]])
# 該方法類(lèi)似于find(),但是如果子串未找到會(huì)拋出ValueError異常。
str.index(sub[, start[, end]])
# 該方法類(lèi)似于rfind(),但是如果子串為找到會(huì)拋出ValueError異常。
str.rindex(sub[, start[, end]])
# 返回在范圍[start, end]內(nèi)指定的字符串sub不重疊出現(xiàn)的次數(shù)。
str.count(sub[, start[, end]])
# 將字符串的編碼版本作為字節(jié)對(duì)象返回,默認(rèn)編碼為“utf-8”。errors的默認(rèn)值為"strict",意味著編碼錯(cuò)誤會(huì)引發(fā)UnicodeError,其他可能的值為"ignore", "replace"等。
str.encode(encoding="utf-8", errors="strict")
# 以當(dāng)前字符串為連接符把iterable中的所有字符串連接成一個(gè)字符串并返回,如果iterable中存在非字符串值(包括bytes對(duì)象),將會(huì)拋出TypeError異常。
str.join(iterable)
# 用sep參數(shù)的值作為分隔符對(duì)字符串進(jìn)行分割,返回一個(gè)字符串列表。如果maxsplit參數(shù)被給出,那么最多進(jìn)行maxsplit次分割操作(因此,得到的字符串里列表將最多有maxsplit+1個(gè)元素);如果maxsplit沒(méi)有被指定或指定為-1,則不限制分割次數(shù)。
str.split(sep=None, maxsplit=-1)
# 用split()函數(shù)類(lèi)似,只是它從右向左進(jìn)行分割。
str.rsplit(seq=None, maxsplit=-1)
# 在字符串中的行邊界位置進(jìn)行切割,返回一個(gè)行的列表。可選參數(shù)keepends為一個(gè)布爾值,表示換行符是否包含結(jié)果列表中,默認(rèn)為false。這里的行邊界包括'\n', '\r', '\r\n'等。|
str.splitlines([keepends])
# 該靜態(tài)方法將返回一個(gè)可用于str.translate(table)方法的轉(zhuǎn)換表(字典)。如果只有一個(gè)參數(shù),它必須是一個(gè)將Unicode ordinals(整數(shù))或字符(長(zhǎng)度為1的字符串) 映射為 Unicode ordinal(整數(shù)),字符串(任意長(zhǎng)度)或None的字典映射。字符鍵值將被轉(zhuǎn)換為整數(shù)。如果有兩個(gè)參數(shù),它們必須是相同長(zhǎng)度的字符串,并且在結(jié)果字典中,x中的每個(gè)字符將被映射到y(tǒng)中相同位置的字符。如果有第三個(gè)參數(shù),它必須是一個(gè)字符串,其字符將在結(jié)果字典中被映射為None。
static str.maketrans(x[, y[, z]])
# 返回一個(gè)字符串副本,通過(guò)給定的轉(zhuǎn)換表table將字符串副本中的每個(gè)字符轉(zhuǎn)換為對(duì)應(yīng)的值(字符/字符串/None)。table參數(shù)必須是通過(guò)__getitem__()實(shí)現(xiàn)索引的對(duì)象,通常是映射或序列。當(dāng)使用Unicode序號(hào)(整數(shù))索引時(shí),table對(duì)象可以執(zhí)行以下任何操作:返回Unicode序號(hào)或字符串,可以將字符映射到一個(gè)或多個(gè)其它字符;返回None,可以從返回字符串中刪除字符;將字符映射到自身,將引發(fā)LookupError異常。
str.translate(table)
# 返回一個(gè)將字符串中的所有小寫(xiě)字母轉(zhuǎn)為大寫(xiě)的字符串拷貝。
str.upper()
# 返回一個(gè)將字符串中的所有大寫(xiě)字母轉(zhuǎn)為小寫(xiě)的字符串拷貝。
str.lower()
# 返回一個(gè)將字符串中的所有大寫(xiě)字母轉(zhuǎn)為小寫(xiě),將所有的小寫(xiě)字母轉(zhuǎn)為大寫(xiě)的字符串拷貝。
str.swapcase()
# 返回一個(gè)將第一個(gè)字母轉(zhuǎn)為大寫(xiě)的字符串拷貝。
str.capitalize()
# 返回一個(gè)將所有單詞首字母轉(zhuǎn)為大寫(xiě)的字符串拷貝。
str.title()
# 如果字符串以指定的前綴prefix開(kāi)始,則返回True,否則返回False。后綴也可以是一個(gè)后綴元祖??蛇x參數(shù)start和end可以指定查找前綴的開(kāi)始和結(jié)束位置。
str.startswith(prefix[, start[, end]])
# 如果字符串以指定的后綴suffix結(jié)尾,則返回True,否則返回False。后綴也可以是一個(gè)后綴元祖??蛇x參數(shù)start和end可以指定查找后綴的開(kāi)始和結(jié)束位置。
str.endswith(suffix[, start[, end]])
# 如果字符串中至少有一個(gè)字符,且所有字符都是十進(jìn)制字符則返回True,否則返回False。此類(lèi)別包括十進(jìn)制數(shù)字和所有可用于形成十進(jìn)制數(shù)字的字符,如 U+0660, ARABIC-INDIC DIGIT ZERO。
str.isdecimal()
# 如果字符串中至少有一個(gè)字符,且所有字符都是數(shù)字則返回True, 否則返回False。數(shù)字包括十進(jìn)制字符和需要特殊處理的數(shù)字,形式上,數(shù)字是具有屬性值Numeric_Type = Digit 或 Numeric_Type = Decimal的字符。
str.isdigit()
# 如果字符串中至少有一個(gè)字符,且所有字符都是數(shù)字字符則返回Ture, 否則返回False。這里的數(shù)字字符包括digit字符和所有具有Unicode數(shù)字值屬性的所有字符。形式上,這里的數(shù)字字符是指具有屬性值Numeric_Type = Digit, Numeric_Type = Decimal 或 Numeric_Type = Numeric的字符。
str.isnumeric()
# 如果字符串中至少有一個(gè)字符,且所有字符都是字母則返回True,否則返回False。
str.isalpha()
# 如果字符串中至少有一個(gè)字符,且所有字符都是numeric或alpha則返回Ture, 否則返回False。即只要上面4個(gè)方法中的任意一個(gè)方法調(diào)用返回Ture則該方法調(diào)用就返回Ture。
str.isalnum()
# 如果字符串中至少有一個(gè)字符,且所有字符都是空白字符則返回True, 否則返回False。
str.isspace()
文本序列操作示例
>>> 'welcome'.center(15, '-')
'----welcome----'
>>> 'welcome'.ljust(15, '-')
'welcome--------'
>>> 'welcome'.rjust(15, '-')
'--------welcome'
>>> '11'.zfill(15)
'000000000000011'
>>>
>>> ' spacious '.strip()
'spacious'
>>> 'www.example.com'.strip('cmowz')
'.example.'
>>> ' spacious '.lstrip()
'spacious '
>>> 'www.example.com'.lstrip('cmowz')
'.example.com'
>>> ' spacious '.rstrip()
' spacious'
>>> 'mississippi'.rstrip('ipz')
'mississ'
>>>
>>> 'Hello, Lilly'.find('ll')
2
>>> 'Hello, Lilly'.find('ll', 4)
9
>>> 'Hello, Lilly'.rfind('ll')
9
>>> 'Hello, Lilly'.rfind('ll', 0, 7)
2
>>> 'Hello, Lilly'.index('ll')
2
>>> 'Hello, Lilly'.index('ll', 4)
9
>>> 'Hello, Lilly'.rindex('ll')
9
>>> 'Hello, Lilly'.rindex('ll', 0, 7)
2
>>> 'Hello, Lilly'.find('lll')
-1
>>> 'Hello, Lilly'.index('lll')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
>>>
>>> ':'.join(['Tom', 'Jerry', 'Peter'])
'Tom:Jerry:Peter'
>>> 'Tom:Jerry:Peter'.split()
['Tom:Jerry:Peter']
>>> 'Tom:Jerry:Peter'.split(sep=':')
['Tom', 'Jerry', 'Peter']
>>> 'Tom:Jerry:Peter'.split(sep=':', maxsplit=1)
['Tom', 'Jerry:Peter']
>>> 'Tom:Jerry:Peter'.rsplit(sep=':')
['Tom', 'Jerry', 'Peter']
>>> 'Tom:Jerry:Peter'.rsplit(sep=':', maxsplit=1)
['Tom:Jerry', 'Peter']
>>> 'Tom:Jerry::Peter:'.split(sep=':') # 空值不會(huì)被合并,可能需要單獨(dú)進(jìn)行空值判斷
['Tom', 'Jerry', '', 'Peter', '']
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines() # 末尾的行尾標(biāo)記不會(huì)產(chǎn)生一個(gè)額外的行
['ab c', '', 'de fg', 'kl']
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
['ab c\n', '\n', 'de fg\r', 'kl\r\n']
>>>
>>> 'abcdedfg'.translate({'a':'A', 'd': 'D'}) # 轉(zhuǎn)換表中的key應(yīng)該是字符對(duì)應(yīng)的Unicode數(shù)字值,而不應(yīng)該是字符本身
'abcdedfg'
>>> 'abcdedfg'.translate({97: 'A', 100: 'D'})
'AbcDeDfg'
>>> str.maketrans({'a': 'A', 'd': 'D'})
{97: 'A', 100: 'D'}
>>> table = str.maketrans({'a': 'A', 'd': 'D'}) # 這樣就不要是查字符對(duì)應(yīng)的Unicode數(shù)字值是多少了
>>> 'abcdedfg'.translate(table)
'AbcDeDfg'
>>>
>>> 'hello, world!'.upper()
'HELLO, WORLD!'
>>> 'hello, world!'.upper().lower()
'hello, world!'
>>> 'Hello, World!'.swapcase()
'hELLO, wORLD!'
>>> 'hello, world!'.capitalize()
'Hello, world!'
>>> 'hello, world!'.title()
'Hello, World!'
4.字符串的格式化
在幾乎所有的編程語(yǔ)言中,字符串的格式化都是非常重要的基本知識(shí)。Python中實(shí)現(xiàn)字符串格式化有以下幾種方式:
- 字符串拼接(不推薦使用)
- 符串本身所支持的方法調(diào)用:str.format(*args, **kwargs)
- 字符串的內(nèi)置操作符:%
通過(guò)字符串拼接實(shí)現(xiàn)式化
>>> a = 2
>>> b = 3
>>> str(a) + ' + ' + str(b) + ' = ' + str(a+b)
'2 + 3 = 5'
此處通過(guò)字符串的拼接來(lái)輸出一定格式的字符串,這會(huì)在內(nèi)存中產(chǎn)生多個(gè)字符串對(duì)象,且操作復(fù)雜,容易出錯(cuò)。
使用str.fromat()進(jìn)行字符串格式化
該方法用于執(zhí)行字符串格式化操作。調(diào)用此方法的字符串可以包含由大括號(hào)字面文本或由大括號(hào){}分割的替換字段。每個(gè)替換字段保存位置參數(shù)的數(shù)字索引或關(guān)鍵字參數(shù)的名稱(chēng)。該方法將返回一個(gè)字符串副本,其中每個(gè)替換字段都替換為相應(yīng)參數(shù)的字符串值。
>>> a = 2
>>> b = 3
>>> '{0} + {1} = {2}'.format(a, b, a+b) # 使用位置參數(shù)
'2 + 3 = 5'
>>> '{a} + = {c}'.format(a=a, b=b, c=a+b) # 使用關(guān)鍵字參數(shù)
'2 + 3 = 5'
>>> '{a} + = {c}'.format({'a': a, 'b': b, 'c': a+b}) # 不能使用字典
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'a'
str.format()可以實(shí)現(xiàn)簡(jiǎn)單的字符串格式化,但是這種格式化方式存在一些怪癖,比如它不支持接收元組(tuple)、字典(dict)等數(shù)據(jù)類(lèi)型作為參數(shù),這是非常不方便的。
使用字符串內(nèi)置操作符(%)進(jìn)行字符串格式化
%操作符是字符串對(duì)象唯一的內(nèi)置操作,也稱(chēng)為字符串格式化或插值運(yùn)算符。該接口提供了一種更強(qiáng)大、靈活和可擴(kuò)展的方法來(lái)格式化文本。格式字符串中的% 轉(zhuǎn)換規(guī)范將會(huì)被替換為0個(gè)或多個(gè)元素的值,效果類(lèi)似于在C語(yǔ)言中使用sprintf()。
如果格式字符串需要單個(gè)參數(shù),那么替換值可以是單個(gè)非元組對(duì)象;否則,替換值必須是具有由格式化字符串指定的條目數(shù)量的元組,或者是單個(gè)映射對(duì)象(例如,字典)。
>>> 'The sum of 2 + 3 is: %d' % 5 # 格式化字符串只需要1個(gè)參數(shù),替換值可以是的那個(gè)非元組字符
'The sum of 2 + 3 is: 5'
>>>
>>> a = 2
>>> b = 3
>>> '%d + %d = %d' % (a, b, a+b) # 格式化字符串需要n(n > 1)個(gè)參數(shù),替換值需要是具有n個(gè)元素的元組
'2 + 3 = 5'
>>> '%(a)d + %(b)d = %(c)d' % {'a': a, 'b': b, 'c': a+b} # 格式化字符串需要n(n > 1)個(gè)參數(shù),替換也可以是具有n個(gè)元素的映射對(duì)象
'2 + 3 = 5'
>>>
上面示例中,格式字符串中的 %d, %(a)d稱(chēng)為“轉(zhuǎn)換說(shuō)明標(biāo)識(shí)符”。這個(gè)標(biāo)識(shí)符可以由2個(gè)或多個(gè)部分組成,且各部分必須按照指定的順序排列:
- '%'字符:表示“轉(zhuǎn)換說(shuō)明標(biāo)識(shí)符”的開(kāi)始;
- 映射鍵名稱(chēng)(Mapping key): 可選部分,由小括號(hào)包含的字符串序列組成,如:(name);
- 轉(zhuǎn)換標(biāo)識(shí)(Conversion flags):可選部分,這個(gè)會(huì)影響一些轉(zhuǎn)換類(lèi)型的結(jié)果;如:'0'表示用數(shù)字字符0進(jìn)行填充,'-'表示左對(duì)齊(用空白字符進(jìn)行右填充)
- 最小字段寬度(Minimum field width): 可選部分,指定轉(zhuǎn)換結(jié)果的最小寬度
- 精度(Precision): 可選部分,通過(guò)".精度值"的方式來(lái)指定小數(shù)點(diǎn)后保留幾位小數(shù)
- 長(zhǎng)度修飾符(Length modifier): 可選部分
- 轉(zhuǎn)換類(lèi)型(Conversion type): 用于指定數(shù)據(jù)類(lèi)型;常用的轉(zhuǎn)換類(lèi)型有 'd'或'i'表示有符號(hào)十進(jìn)制整數(shù),'f'或'F'表示浮點(diǎn)數(shù),'s'表示字符串, '%'表示其本身
由上可見(jiàn),在“轉(zhuǎn)換說(shuō)明表示符”的7個(gè)組成部分中,只有第1部分"%",和最后一部分"轉(zhuǎn)換類(lèi)型"是必須的指定的,其他部分都是可選的輔助項(xiàng)。另外,長(zhǎng)度修飾符(h,l或L)可以存在,但是將被忽略,因?yàn)閷?duì)于Python不是必要的。也就是說(shuō),ld與%d是相同的。
>>> student01 = {'name': 'Peter', 'sno': 15, 'age': 22, 'score': 93.92532}
>>> msg = '''
... ##### Information of student: %(name)s #####
... 姓名:%(name)s
... 學(xué)號(hào):%(sno)010d
... 年齡:%(age)d
... 得分:%(score).2f
... ----- end -----
... ''' % student01
>>> print(msg)
##### Information of student: Peter #####
姓名:Peter
學(xué)號(hào):0000000015
年齡:22
得分:93.93
----- end -----
>>>
|