每週乙個 python 模組
目的:包含用於處理文字的常量和類。
string 模組可以追溯到最早的 python 版本。先前在此模組中實現的許多功能已移至 str 物件方法。string 模組保留了幾個有用的常量和類來處理 str 物件。
直接看下面的事例:
import string
s = 'the quick brown fox jumped over the lazy dog.'
print(s) # the quick brown fox jumped over the lazy dog.
print(string.capwords(s)) # the quick brown fox jumped over the lazy dog.
複製**
字串模板作為 pep 292 一部分新增,旨在替代內建插值語法。通過string.template
插值,在名稱前加上$
(例如,$var
)來標識變數。或者,如果需要將它們從周圍的文字中設定出來,它們也可以用花括號包裹(例如:$
)。
import string
values =
t = string.template("""
variable : $var
escape : $$
variable in text: $iable
""")
print('template:', t.substitute(values))
s = """
variable : %(var)s
escape : %%
variable in text: %(var)siable
"""print('interpolation:', s % values)
s = """
variable :
escape : }
variable in text: iable
"""print('format:', s.format(**values))
# output
# 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()
方法可以避免異常。
import string
values =
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))
# output
# error: 'missing'
# safe_substitute(): foo is here but $missing is not provided
複製**
由於字典中沒有missing
值,引發了乙個keyerror
,safe_substitute()
捕獲它並在文字中單獨保留變數表示式。
可以通過調整用於在模板主體中查詢變數名稱的正規表示式模式來更改預設語法。一種簡單的方法是更改delimiter
和idpattern
類屬性。
import string
class
mytemplate
(string.template):
delimiter = '%'
idpattern = '[a-z]+_[a-z]+'
template_text = '''
delimiter : %%
replaced : %with_underscore
ignored : %notunderscored
'''d =
t = mytemplate(template_text)
print('modified id pattern:')
print(t.safe_substitute(d))
# output
# modified id pattern:
# # delimiter : %
# replaced : replaced
# ignored : %notunderscored
複製**
在此示例中,替換規則已更改,以分隔符%代替,而變數名必須在中間某處包含下劃線。該模式%notunderscored
不會被任何內容替換,因為它不包含下劃線字元。
對於更複雜的更改,可以覆蓋pattern
屬性並定義全新的正規表示式。提供的模式必須包含四個命名組,用於捕獲轉義分隔符,命名變數,變數名稱的支撐版本以及無效分隔符模式。
import string
t = string.template('$var')
print(t.pattern.pattern)
# output
# \$(?:
# (?p\$) | # two delimiters
# (?p[_a-z][_a-z0-9]*) | # identifier
# | # braced identifier
# (?p) # ill-formed delimiter exprs
# )複製**
t.pattern
是乙個已編譯的正規表示式,但原始字串可通過其pattern
屬性獲得。
此示例使用}
作為變數語法定義用於建立新型別模板的新模式。
import re
import string
class
mytemplate
(string.template):
delimiter = '\}|
(?p[_a-z][_a-z0-9]*)\}\}|
(?p)
)'''
t = mytemplate('''
}''')
print('matches:', t.pattern.findall(t.template))
print('substituted:', t.safe_substitute(var='replacement'))
# output
# matches: [('~ \t\n\r\x0b\x0c'
# # punctuation='!"#$%&\'()*+,-./:;<=>?@[\\]^_`~'
# # whitespace=' \t\n\r\x0b\x0c'
複製**
這些常量在處理 ascii 資料時很有用,但由於在某種形式的 unicode 中遇到非 ascii 文字越來越常見,因此它們的應用受到限制。
每週乙個 Python 模組 fnmatch
每週乙個 python 模組 fnmatch 模組主要用於檔名的比較,使用 unix shell 使用的 glob 樣式模式。fnmatch 將單個檔名與模式進行比較並返回布林值,來看它們是否匹配。當作業系統使用區分大小寫的檔案系統時,比較區分大小寫。import fnmatch import os...
每週乙個 Python 標準庫 struct
技術部落格 structs 支援將資料打包成字串,並使用格式說明符從字串中解壓縮資料,格式說明符由表示資料型別的字元 可選計數和位元組順序指示符組成。有關支援的格式說明符的完整列表,請參閱標準庫文件。在此示例中,說明符呼叫整數或長整數值,雙位元組字串和浮點數。格式說明符中的空格用作分隔型別指示符,並...
每週乙個 Python 標準庫 glob
技術部落格 儘管globapi 不多,但該模組具有很強的功能。當程式需要通過名稱與模式匹配的方式查詢檔案列表時,它很有用。要建立乙個檔案列表,這些檔名具有特定的副檔名,字首或中間的任何公共字串,這個時候,使用glob而不是編寫自定義 來掃瞄目錄內容。glob模式規則與re模組使用的正規表示式不同。相...