1. 程式人生 > >【轉】Python數據類型之“文本序列(Text Sequence)”

【轉】Python數據類型之“文本序列(Text Sequence)”

core true flag dex 引號 file nco title pin

【轉】Python數據類型之“文本序列(Text Sequence)”

Python中的文本序列類型


Python中的文本數據由str對象或字符串進行處理。

1.字符串

字符串是Unicode碼值的不可變序列。字符串字面量有多種形式:

  • 單引號:‘允許嵌入"雙"引號‘
  • 雙引號:"允許嵌入‘單‘引號"
  • 三引號:‘‘‘三個單引號‘‘‘, """三個雙引號"""

說明:

a) 三引號的字符串可以跨越多行,所關聯的空格將包含在字符串文字中;

b) 字符串也可以使用str構建函數從其他對象創建;

c) 因為沒有單獨的“字符”類型,因此索引字符串將產生長度為1的字符串。也就是說,對於非空字符串s,s[0] == s[0:1];

d) 沒有可變的字符串類型,但是str.join()或io.StringIO可以用於從多個片斷有效地構造字符串;

e) 字符串中可以是用反斜線"\"對特殊字符進行轉義,也可以在字符串字面上使用"r"前綴來取消轉義;

f) Python 3.3中的修改:為了向後兼容Python 2系列,在字符串字面上再次允許使用"u"前綴,但是它對字符串文字的含義沒有影響,也不能與"r"前綴組合使用;

g) 作為單個表達式的一部分並且在它們之間只有空格的字符串文字將被隱式轉換為單個字符串文字。也就是說("spam""eggs") == "spam eggs";

2.str類

str類構建方法

class str(object=‘‘)
class str(object=b‘‘, encoding=‘utf-8‘, errors=‘strict‘)

str類的構建方法返回對象的字符串版本。如果未提供對象參數,則返回空字符串。否則,str()的行為取決於是否給出了encoding和errors參數,如下所示:

  • 如果既沒有給出encoding也沒有給出errors參數,str(object)將會返回object.__str__()的值,這是object的“非正式”或可打印的字符串表示。對於字符串對象,這是字符串本身。如果該object沒有__str__()方法,那麽str()將會返回repr(object)的結果值。
  • 如果給出了encoding或errors兩個參數中的至少一個,則object應該是類似於字節的對象(例如bytes或bytearray)。在這種情況下,如果object是bytes(或 bytearray)對象,則str(bytes,encoding,errors)等價於bytes.decode(encoding, errors)。
  • 將字節對象傳遞給str()而不使用encoding或errors參數屬於返回非正式字符串表示形式的第一種情況。

str構建示例

>>> ‘Hello, World!‘  # 單引號
‘Hello, World!‘
>>> "Hello, World!"  # 雙引號
‘Hello, World!‘
>>> """  # 三引號,多行
... Hello,
... World!
... """
‘\nHello,\nWorld!\n‘
>>> "Hello, \"World!\""  # 使用轉義
‘Hello, "World!"‘
>>> str()  # 不給出object參數,返回空字符串
‘‘
>>> str("Hello, World!")  # 給出object參數,但不給出encoding和errors
‘Hello, World!‘
>>> str(b"Hello, World!")  
"b‘Hello, World!‘"
>>> str(b"Hello, World!", encoding=‘utf-8‘)  # 給出object參數,也給出encoding參數
‘Hello, World!‘

3.文本序列支持的操作

由於文本序列是一個特殊的(專門處理文本)不可變序列,因此它不支持可變序列特有的操作,但是它支持所有的序列通用操作。下面介紹下str支持的除序列通用操作外的其他方法:

 
# 返回一個將字符串居中的指定長度的字符串,填充部分使用fillchar指定的字符來完成(默認為ASCII空格)。如果width小於或等於len(s),則返回原始字符串
str.center(width[,fillchar])
# 與center()方法類似,只是字符串位於左邊, 填充字符位於右邊
str.ljust(width[,fillchar])
# 與center()方法類似,只是字符串位於右邊,填充字符位於左邊
str.rjust(width[,fillchar])
# 在數字字符串左側以ASCII的‘0‘數字進行填充,形成一個長度為width的字符串副本,並返回。如果數字字符串中包含前綴符號(如 ‘+‘/‘-‘)則‘0‘會被插入到前綴字符與數字字符之間。如果width<=len(s),則返回原始字符串。
str.zfill(width)

# 返回字符串刪除指定的前導字符和尾隨字符之後的副本。可選參數chars是一個字符串,用來指定要刪除的字符集合,如果省略或為None則chars參數默認為刪除空格。註意:chars參數不是前綴或後綴字,相反,它包含的字符的所有組合都會被刪除。
str.strip([chars])
# 與strip()方法類似,只是僅刪除字符串的前導字符
str.lstrip([chars])
# 與strop()方法類似,只是僅刪除字符串的尾隨字符
str.rstrip([chars])

# 返回子串sub在切片s[start:end]中第一次出現的索引位置,如果子串sub不存在則返回-1。需要註意的是,只有當需要知道sub的位置時,才應該使用find()方法,如果要檢查sub是否是字符串的子串,請使用in運算符。
str.find(sub[,start[,end]])
# 返回子串sub在切片s[start:end]中最後一次出現的索引位置,如果子串sub存在則返回-1。
str.rfind(sub[, start[, end]])

# 該方法類似於find(),但是如果子串未找到會拋出ValueError異常。
str.index(sub[, start[, end]])
# 該方法類似於rfind(),但是如果子串為找到會拋出ValueError異常。
str.rindex(sub[, start[, end]])

# 返回在範圍[start, end]內指定的字符串sub不重疊出現的次數。
str.count(sub[, start[, end]])
# 將字符串的編碼版本作為字節對象返回,默認編碼為“utf-8”。errors的默認值為"strict",意味著編碼錯誤會引發UnicodeError,其他可能的值為"ignore", "replace"等。
str.encode(encoding="utf-8", errors="strict")

# 以當前字符串為連接符把iterable中的所有字符串連接成一個字符串並返回,如果iterable中存在非字符串值(包括bytes對象),將會拋出TypeError異常。
str.join(iterable)
# 用sep參數的值作為分隔符對字符串進行分割,返回一個字符串列表。如果maxsplit參數被給出,那麽最多進行maxsplit次分割操作(因此,得到的字符串裏列表將最多有maxsplit+1個元素);如果maxsplit沒有被指定或指定為-1,則不限制分割次數。
str.split(sep=None, maxsplit=-1)
# 用split()函數類似,只是它從右向左進行分割。
str.rsplit(seq=None, maxsplit=-1)
# 在字符串中的行邊界位置進行切割,返回一個行的列表。可選參數keepends為一個布爾值,表示換行符是否包含結果列表中,默認為false。這裏的行邊界包括‘\n‘, ‘\r‘, ‘\r\n‘等。|
str.splitlines([keepends])

# 該靜態方法將返回一個可用於str.translate(table)方法的轉換表(字典)。如果只有一個參數,它必須是一個將Unicode ordinals(整數)或字符(長度為1的字符串) 映射為 Unicode ordinal(整數),字符串(任意長度)或None的字典映射。字符鍵值將被轉換為整數。如果有兩個參數,它們必須是相同長度的字符串,並且在結果字典中,x中的每個字符將被映射到y中相同位置的字符。如果有第三個參數,它必須是一個字符串,其字符將在結果字典中被映射為None。
static str.maketrans(x[, y[, z]])
# 返回一個字符串副本,通過給定的轉換表table將字符串副本中的每個字符轉換為對應的值(字符/字符串/None)。table參數必須是通過__getitem__()實現索引的對象,通常是映射或序列。當使用Unicode序號(整數)索引時,table對象可以執行以下任何操作:返回Unicode序號或字符串,可以將字符映射到一個或多個其它字符;返回None,可以從返回字符串中刪除字符;將字符映射到自身,將引發LookupError異常。
str.translate(table)  

# 返回一個將字符串中的所有小寫字母轉為大寫的字符串拷貝。
str.upper()
# 返回一個將字符串中的所有大寫字母轉為小寫的字符串拷貝。
str.lower()
# 返回一個將字符串中的所有大寫字母轉為小寫,將所有的小寫字母轉為大寫的字符串拷貝。
str.swapcase()
# 返回一個將第一個字母轉為大寫的字符串拷貝。
str.capitalize()
# 返回一個將所有單詞首字母轉為大寫的字符串拷貝。
str.title()

# 如果字符串以指定的前綴prefix開始,則返回True,否則返回False。後綴也可以是一個後綴元祖。可選參數start和end可以指定查找前綴的開始和結束位置。
str.startswith(prefix[, start[, end]])
# 如果字符串以指定的後綴suffix結尾,則返回True,否則返回False。後綴也可以是一個後綴元祖。可選參數start和end可以指定查找後綴的開始和結束位置。
str.endswith(suffix[, start[, end]])

# 如果字符串中至少有一個字符,且所有字符都是十進制字符則返回True,否則返回False。此類別包括十進制數字和所有可用於形成十進制數字的字符,如 U+0660, ARABIC-INDIC DIGIT ZERO。
str.isdecimal()
# 如果字符串中至少有一個字符,且所有字符都是數字則返回True, 否則返回False。數字包括十進制字符和需要特殊處理的數字,形式上,數字是具有屬性值Numeric_Type = Digit 或 Numeric_Type = Decimal的字符。
str.isdigit()
# 如果字符串中至少有一個字符,且所有字符都是數字字符則返回Ture, 否則返回False。這裏的數字字符包括digit字符和所有具有Unicode數字值屬性的所有字符。形式上,這裏的數字字符是指具有屬性值Numeric_Type = Digit, Numeric_Type = Decimal 或 Numeric_Type = Numeric的字符。
str.isnumeric()
# 如果字符串中至少有一個字符,且所有字符都是字母則返回True,否則返回False。
str.isalpha()
# 如果字符串中至少有一個字符,且所有字符都是numeric或alpha則返回Ture, 否則返回False。即只要上面4個方法中的任意一個方法調用返回Ture則該方法調用就返回Ture。
str.isalnum()
# 如果字符串中至少有一個字符,且所有字符都是空白字符則返回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=‘:‘)  # 空值不會被合並,可能需要單獨進行空值判斷
[‘Tom‘, ‘Jerry‘, ‘‘, ‘Peter‘, ‘‘]
>>> ‘ab c\n\nde fg\rkl\r\n‘.splitlines()  # 末尾的行尾標記不會產生一個額外的行
[‘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‘})  # 轉換表中的key應該是字符對應的Unicode數字值,而不應該是字符本身
‘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‘})  # 這樣就不要是查字符對應的Unicode數字值是多少了
>>> ‘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.字符串的格式化

在幾乎所有的編程語言中,字符串的格式化都是非常重要的基本知識。Python中實現字符串格式化有以下幾種方式:

  • 字符串拼接(不推薦使用)
  • 符串本身所支持的方法調用:str.format(*args, **kwargs)
  • 字符串的內置操作符:%

通過字符串拼接實現式化

>>> a = 2
>>> b = 3
>>> str(a) + ‘ + ‘ + str(b) + ‘ = ‘ + str(a+b)
‘2 + 3 = 5‘

此處通過字符串的拼接來輸出一定格式的字符串,這會在內存中產生多個字符串對象,且操作復雜,容易出錯。

使用str.fromat()進行字符串格式化

該方法用於執行字符串格式化操作。調用此方法的字符串可以包含由大括號字面文本或由大括號{}分割的替換字段。每個替換字段保存位置參數的數字索引或關鍵字參數的名稱。該方法將返回一個字符串副本,其中每個替換字段都替換為相應參數的字符串值。

>>> a = 2
>>> b = 3
>>> ‘{0} + {1} = {2}‘.format(a, b, a+b)  # 使用位置參數
‘2 + 3 = 5‘
>>> ‘{a} + {b} = {c}‘.format(a=a, b=b, c=a+b)  # 使用關鍵字參數
‘2 + 3 = 5‘
>>> ‘{a} + {b} = {c}‘.format({‘a‘: a, ‘b‘: b, ‘c‘: a+b})  # 不能使用字典
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: ‘a‘

str.format()可以實現簡單的字符串格式化,但是這種格式化方式存在一些怪癖,比如它不支持接收元組(tuple)、字典(dict)等數據類型作為參數,這是非常不方便的。

使用字符串內置操作符(%)進行字符串格式化

%操作符是字符串對象唯一的內置操作,也稱為字符串格式化或插值運算符。該接口提供了一種更強大、靈活和可擴展的方法來格式化文本。格式字符串中的% 轉換規範將會被替換為0個或多個元素的值,效果類似於在C語言中使用sprintf()。

如果格式字符串需要單個參數,那麽替換值可以是單個非元組對象;否則,替換值必須是具有由格式化字符串指定的條目數量的元組,或者是單個映射對象(例如,字典)。

>>> ‘The sum of 2 + 3 is: %d‘ % 5  # 格式化字符串只需要1個參數,替換值可以是的那個非元組字符
‘The sum of 2 + 3 is: 5‘
>>>
>>> a = 2
>>> b = 3
>>> ‘%d + %d = %d‘ % (a, b, a+b)  # 格式化字符串需要n(n > 1)個參數,替換值需要是具有n個元素的元組
‘2 + 3 = 5‘
>>> ‘%(a)d + %(b)d = %(c)d‘ % {‘a‘: a, ‘b‘: b, ‘c‘: a+b}  # 格式化字符串需要n(n > 1)個參數,替換也可以是具有n個元素的映射對象
‘2 + 3 = 5‘
>>>

上面示例中,格式字符串中的 %d, %(a)d稱為“轉換說明標識符”。這個標識符可以由2個或多個部分組成,且各部分必須按照指定的順序排列:

  • ‘%‘字符:表示“轉換說明標識符”的開始;
  • 映射鍵名稱(Mapping key): 可選部分,由小括號包含的字符串序列組成,如:(name);
  • 轉換標識(Conversion flags):可選部分,這個會影響一些轉換類型的結果;如:‘0‘表示用數字字符0進行填充,‘-‘表示左對齊(用空白字符進行右填充)
  • 最小字段寬度(Minimum field width): 可選部分,指定轉換結果的最小寬度
  • 精度(Precision): 可選部分,通過".精度值"的方式來指定小數點後保留幾位小數
  • 長度修飾符(Length modifier): 可選部分
  • 轉換類型(Conversion type): 用於指定數據類型;常用的轉換類型有 ‘d‘或‘i‘表示有符號十進制整數,‘f‘或‘F‘表示浮點數,‘s‘表示字符串, ‘%‘表示其本身

由上可見,在“轉換說明表示符”的7個組成部分中,只有第1部分"%",和最後一部分"轉換類型"是必須的指定的,其他部分都是可選的輔助項。另外,長度修飾符(h,l或L)可以存在,但是將被忽略,因為對於Python不是必要的。也就是說,ld與%d是相同的。

>>> student01 = {‘name‘: ‘Peter‘, ‘sno‘: 15, ‘age‘: 22, ‘score‘: 93.92532}
>>> msg = ‘‘‘
... ##### Information of student: %(name)s #####
... 姓名:%(name)s
... 學號:%(sno)010d
... 年齡:%(age)d
... 得分:%(score).2f
... ----- end -----
... ‘‘‘ % student01
>>> print(msg)

##### Information of student: Peter #####
姓名:Peter
學號:0000000015
年齡:22
得分:93.93
----- end -----

>>>

【轉】Python數據類型之“文本序列(Text Sequence)”