[雪峰磁針石部落格]python標準模組介紹-string:文字常量和模板

書籍尋找發表於2018-08-16

string—文字常量和模板

作用:包含處理文字的常量和類。

Python版本:1.4及以後版本

最早的Python版本就有string模組。 之前在這個模組中實現的許多函式已經移至str物件的方法。 string模組保留了幾個有用的常量和類,用於處理str物件。

程式碼地址

函式

capwords()的將字串中所有單詞的首字母大寫。

#!python
>>> import string
>>> t = "hello world!"
>>> string.capwords(t)
`Hello World!`
>>> t
`hello world!`
>>> t.capitalize()
`Hello world!`
>>> t
`hello world!`

結果等同於先呼叫split(),把結果列表中各個單詞的首字母大寫,然後呼叫join()合併結果。

因為str物件已經有capitalize()方法,該函式的實際意義並不大。

模板

字串模板已經作為PEP 292的一部分增加到Python 2.4中,並得到擴充套件,以替代內建拼接(interpolation)語法類似。使用string.Template拼接時,可以在變數名前面加上字首$(如$var)來標識變數,如果需要與兩側的文字相區分,還可以用大括號將變數括起(如${var})。

下面的例子對簡單的模板和使用%操作符及str.format()進行了比較。

#!python
import string

values = {`var`: `foo`}

t = string.Template("""
Variable        : $var
Escape          : $$
Variable in text: ${var}iable
""")

print(`TEMPLATE:`, t.substitute(values))

s = """
Variable        : %(var)s
Escape          : %%
Variable in text: %(var)siable
"""

print(`INTERPOLATION:`, s % values)

s = """
Variable        : {var}
Escape          : {{}}
Variable in text: {var}iable
"""

print(`FORMAT:`, s.format(**values))
"""

print `INTERPOLATION:`, s % values

執行結果:

#!python
 python3 string_template.py 
TEMPLATE: 
Variable        : foo
Escape          : $
Variable in text: fooiable

INTERPOLATION: 
Variable        : foo
Escape          : %
Variable in text: fooiable

FORMAT: 
Variable        : foo
Escape          : {}
Variable in text: fooiable

模板與標準字串拼接的重要區別是模板不考慮引數型別。模板中值會轉換為字串且沒有提供格式化選項。例如沒有辦法控制使用幾位有效數字來表示浮點數值。

通過使用safe_substitute()方法,可以避免未能提供模板所需全部引數值時可能產生的異常。

tring_template_missing.py

#!python

import string

values = {`var`: `foo`}

t = string.Template("$var is here but $missing is not provided")

try:
    print(`substitute()     :`, t.substitute(values))
except KeyError as err:
    print(`ERROR:`, str(err))

print(`safe_substitute():`, t.safe_substitute(values))

由於values字典中沒有對應missing的值,因此substitute()會產生KeyError。不過,safe_substitute()不會丟擲這個錯誤,它將捕獲這個異常,並在文字中保留變數表示式。

#!python

$ python3 string_template_missing.py
ERROR: `missing`
safe_substitute(): foo is here but $missing is not provided

高階模板(非常用)

可以修改string.Template的預設語法,為此要調整它在模板體中查詢變數名所使用的正規表示式模式。簡單的做法是修改delimiter和idpattern類屬性。

string_template_advanced.py

#!python
import string


class MyTemplate(string.Template):
    delimiter = `%`
    idpattern = `[a-z]+_[a-z]+`


template_text = ```
  Delimiter : %%
  Replaced  : %with_underscore
  Ignored   : %notunderscored
```

d = {
    `with_underscore`: `replaced`,
    `notunderscored`: `not replaced`,
}

t = MyTemplate(template_text)
print(`Modified ID pattern:`)
print(t.safe_substitute(d))

執行結果:

#!python

$ python3 string_template_advanced.py
Modified ID pattern:

  Delimiter : %
  Replaced  : replaced
  Ignored   : %notunderscored

預設模式

#!python
>>> import string
>>> t = string.Template(`$var`)
>>> print(t.pattern.pattern)

    $(?:
      (?P<escaped>$) |   # Escape sequence of two delimiters
      (?P<named>(?-i:[_a-zA-Z][_a-zA-Z0-9]*))      |   # delimiter and a Python identifier
      {(?P<braced>(?-i:[_a-zA-Z][_a-zA-Z0-9]*))}   |   # delimiter and a braced identifier
      (?P<invalid>)              # Other ill-formed delimiter exprs
    )
    

string_template_newsyntax.py

#!python

import re
import string


class MyTemplate(string.Template):
    delimiter = `{{`
    pattern = r```
    {{(?:
    (?P<escaped>{{)|
    (?P<named>[_a-z][_a-z0-9]*)}}|
    (?P<braced>[_a-z][_a-z0-9]*)}}|
    (?P<invalid>)
    )
    ```


t = MyTemplate(```
{{{{
{{var}}
```)

print(`MATCHES:`, t.pattern.findall(t.template))
print(`SUBSTITUTED:`, t.safe_substitute(var=`replacement`))

執行結果:

#!python
$ python3 string_template_newsyntax.py
MATCHES: [(`{{`, ``, ``, ``), (``, `var`, ``, ``)]
SUBSTITUTED: 
{{
replacement

格式化

Formatter類實現與str.format()類似。 其功能包括型別轉換,對齊,屬性和欄位引用,命名和位置模板引數以及特定型別的格式選項。 大多數情況下,fformat()方法是這些功能的更方便的介面,但是Formatter是作為父類,用於需要變化的情況。

常量

string模組包含許多與ASCII和數字字符集有關的常量。

string_constants.py

#!python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author:    xurongzhong#126.com wechat:pythontesting qq:37391319
# 技術支援 釘釘群:21745728(可以加釘釘pythontesting邀請加入) 
# qq群:144081101 591302926  567351477
# CreateDate: 2018-6-12

import inspect
import string


def is_str(value):
    return isinstance(value, str)


for name, value in inspect.getmembers(string, is_str):
    if name.startswith(`_`):
        continue
    print(`%s=%r
` % (name, value))

執行結果

#!python
$ python3 string_constants.py
ascii_letters=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`

ascii_lowercase=`abcdefghijklmnopqrstuvwxyz`

ascii_uppercase=`ABCDEFGHIJKLMNOPQRSTUVWXYZ`

digits=`0123456789`

hexdigits=`0123456789abcdefABCDEF`

octdigits=`01234567`

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

x0bx0c`

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

whitespace=` 	

x0bx0c`

參考資料


相關文章