程式扎記: [Python Std Library] String services : string — Common string operations

標籤

2012年3月24日 星期六

[Python Std Library] String services : string — Common string operations


翻譯自 這裡
Preface :
The string module contains a number of useful constants and classes, as well as some deprecated legacy functions that are also available as methods on strings. In addition, Python’s built-in string classes support the sequence type methods described in the Sequence Types section, and also the string-specific methods described in the String Methods section. To output formatted strings use template strings or the % operator described in the String Formatting Operations section. Also, see the re module for string functions based on regular expressions.

String constants :
在 string 模組, 你有以下常數可以使用 (底下範例需先 import string):
string.ascii_letters

包含了常數 ascii_lowercase 與 ascii_uppercase.
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

string.ascii_lowercase / string.ascii_uppercase
直接看下面範例 :
>>> string.ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'
>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

string.digits
>>> string.digits
'0123456789'

string.hexdigits
>>> string.hexdigits
'0123456789abcdefABCDEF'

string.octdigits
>>> string.octdigits
'01234567'

string.punctuation
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'

string.printable
>>> string.printable
'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'

string.whitespace
>>> string.whitespace
' \t\n\r\x0b\x0c'

String functions :
這邊只列出一個常用函數 :
string.capwords(s[, sep])
這個函數會先使用 str.split() 將字串切成一個個 word, 再使用 str.capitalize() 將word 首字元大寫, 最後便是使用 str.join() 將每個 word 結合. 這邊第二個參數 sep 便是決定 word 要怎麼切與最後怎麼結合 ; 如果為 None 或是沒有給的話, 使用空白 white space.
>>> string.capwords('hi john. long time no see')
'Hi John. Long Time No See' # 多出來的 white space 會被移除, 包含 leading/trailing space.
>>> string.capwords('a-b--c def', '-')
'A-B--C def'

String Formatting :
New in version 2.6.
The built-in str and unicode classes provide the ability to do complex variable substitutions and value formatting via the str.format() method described in PEP 3101. TheFormatter class in the string module allows you to create and customize your own string formatting behaviors using the same implementation as the built-in format()method. 接著我們來看看類別 Formatter 提供的方法 :
format(format_string, *args, **kwargs)
這個函數用法跟 Java/C 的 printf() 雷同, 而 format 的語法可以參考 Format String Syntax. 簡單範例可以參考下面 :
>>> fmt = string.Formatter()
>>> fmt.format("{0} {1}", 'a', 'b')
'a b'
>>> fmt.format("int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42)
'int: 42; hex: 2a; oct: 52; bin: 101010'

更多 Formatter 的用法可以參考 這裡.

Format String Syntax :
字串物件上的 str.format() 與上面 Formatter 在格式字串語法相同. 在使用格式字串時, 使用 {} 來替換後面的參數. 如果你只是要單純的列印字元 '{' 或 '}', 可以 double 他們成 '{{' 或 '}}' 來取消原有替代字串的功能. 參考範例如下 :
>>> str.format(r"Formta string arg1={0}, arg2={1}. Single brace char : '{{{{' and '}}}}'".format("abc", 123))
"Formta string arg1=abc, arg2=123. Single brace char : '{' and '}'"

在使用 {} 時的一般語法如下所示 :


有看沒有懂? 沒關係我也是. 直接來看幾個範例 :


另外上面有提到 flag conversion ::= "r" | "s" ; 對應到底字串是如何產生. '!s' 指呼叫物件上方法 str() ; 而 '!r' 呼叫物件上方法 repr().

Format Specification Mini-Language :
看完語法後, 接著來看怎麼對字串或特定的資料 (如數字) 進行格式化. 首先來看說明 :


霧煞煞? 沒關係有範例有真相, 先來看看 align 與 fill 的用法 :


接著來看看 align 的說明 :


而 sign 的說明如下 :


接著來看 sign 使用範例 :


至於 precision 則是用來顯示 float point 數值時最多小數位數. 例如 :
>>> "{0:.3f}".format(0.123456) # Only 3 digit after . will show
'0.123'

至於數字的呈現, 可以使用 10進位, 2 進位 16進位 etc. 底下為其格式字元說明 :


接著是範例 :


如果你的參數是 float, 則可以使用的格式字元說明如下 :


Format examples :
基本上目前所說明的格式語法與舊式的 % 用法差異不大. 原本的 '%03.2f' 只要使用 {} 便可以輕鬆改寫成 '{:03.2f}'. 這邊利用一堆範例來複習你剛剛學的格式語法. 首先來看看accessing arguments 的範例 :
>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{}, {}, {}'.format('a', 'b', 'c') # 2.7+ only
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{2}, {1}, {0}'.format(*'abc') # unpacking argument sequence
'c, b, a'
>>> '{0}{1}{0}'.format('-', 'abc') # arguments' indices can be repeated
'-abc-'

接著你也可以使用 key arguments 來 mapping :
>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>> 'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'

格式語法也可以 access 參數的 attribute :
>>> c = 3-5j
>>> ('The complex number {0} is formed from the real part {0.real} '
... 'and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>> class Point(object):
... def __init__(self, x, y):
... self.x, self.y = x, y
... def __str__(self):
... return 'Point({self.x}, {self.y})'.format(self=self)
...
>>> str(Point(4, 2))
'Point(4, 2)'

如果你的參數是 Sequence type 也是沒問題的拉 :
>>> coord = (3, 5)
>>> 'X: {0[0]}; Y: {0[1]}'.format(coord)
'X: 3; Y: 5'

另外 conversion 的使用差別可以參考下面範例 :
>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"

那如果我要對齊字串呢, 使用 align 格式字元 : <, >, = 或 ^ 來完成 :
>>> '{:<30}'.format('left aligned')
'left aligned '
>>> '{:>30}'.format('right aligned')
' right aligned'
>>> '{:^30}'.format('centered')
' centered '
>>> '{:*^30}'.format('centered') # use '*' as a fill char
'***********centered***********'

對於數字的正負號, 其實也有學問的拉 :
>>> '{:+f}; {:+f}'.format(3.14, -3.14) # show it always
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14) # show a space for positive numbers
' 3.140000; -3.140000'
>>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}'
'3.140000; -3.140000'

數字的進位有 2, 8, 10 與 16 進位的選擇 :
>>> # format also supports binary numbers
>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)
'int: 42; hex: 2a; oct: 52; bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)
'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'

如果你要表現一個比較大的數字, 可以使用 comma 讓數字看起來比較有可讀性 :
>>> '{:,}'.format(1234567890)
'1,234,567,890'

至於小數點的精準度 :
>>> points = 19.5
>>> total = 22
>>> 'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 88.64%'

更神奇的是, 連時間的格式化也辦得到喔 :
>>> d = datetime.datetime(1980, 7, 31, 12, 12, 59)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'1980-07-31 12:12:59'

其實格式字元使用還可以更豐富, 如迭代格式字符 etc :

This message was edited 1 time. Last update was at 24/03/2012 21:48:49

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!