格式化字符串及常見字符串操作函數

1 格式化字符串

1.1 使用字符串格式設置運算符——%怠堪。

此種情形類似于C語言中的printf:在%左邊指定一個字符串(格式字符串)乌昔,并在右邊指定要設置其格式的值。指定要設置其格式的值時尾组,可使用單個值(如字符串或數字)忙芒,可使用元組(如果要設置多個值的格式),還可使用字典(這將在下一章討論)讳侨,其中最常見的是元組呵萨。

>>> format = "Hello, %s. %s enough for ya?"
>>> values = ('world', 'Hot')
>>> format % values
'Hello, world. Hot enough for ya?'

1.2 使用format格式化字符串

使用這種方法時,每個替換字段都用花括號括起跨跨,其中可能包含名稱潮峦,還可能包含有關如何對相應的值進行轉換和格式設置的信息。

#默認按照format中指定的順序進行替換
>>> "{}, {} and {}".format("first", "second", "third")  
'first, second and third'

#將{num}用format中第num個參數進行替換
>>> "{0}, {1} and {2}".format("first", "second", "third")  
'first, second and third'
>>> "{3} {0} {2} {1} {3} {0}".format("be", "not", "or", "to") 
'to be or not to be'

#將{name}用format中名為name的參數進行替換
>>> from math import pi
>>> "{name} is approximately {value:.2f}.".format(value=pi, name="π")
'π is approximately 3.14.

1.2.1 替換字段

每個值都被插入字符串中勇婴,以替換用花括號括起的替換字段忱嘹。要在最終結果中包含花括號,可在格式字符串中使用兩個花括號(即{{或}})來指定耕渴。

>>> "{{ceci n'est pas une replacement field}}".format()
"{ceci n'est pas une replacement field}"

在格式字符串中拘悦,最激動人心的部分為替換字段。替換字段由如下部分組成橱脸,其中每個部分都是可選的础米。

  • 字段名:索引或標識符分苇,指出要設置哪個值的格式并使用結果來替換該字段。除指定值外椭盏,還可指定值的特定部分组砚,如列表的元素。
  • 轉換標志:跟在嘆號后面的單個字符掏颊。當前 支持的字符包括 r (表示repr)糟红、 s(表示str)和a(表示ascii) 。如果你指定了轉換標志乌叶,將不使用對象本身的格式設置機制盆偿,而是使用指定的函數將對象轉換為字符串,再做進一步的格式設置准浴。
  • 格式說明符:跟在冒號后面的表達式(這種表達式是使用微型格式指定語言表示的)事扭。格式說明符讓我們能夠詳細地指定最終的格式,包括格式類型(如字符串乐横、浮點數或十六進制數)求橄,字段寬度和數的精度,如何顯示符號和千位分隔符葡公,以及各種對齊和填充方式罐农。
    下面詳細介紹其中的一些要素

(1) 替換字段名

在最簡單的情況下,只需向format提供要設置其格式的未命名參數催什,并在格式字符串中使用未命名字段涵亏。此時,將按順序將字段和參數配對蒲凶。你還可給參數指定名稱气筋,這種參數將被用于相應的替換字段中。你可混合使用這兩種方法旋圆。

>>> "{foo} {} {bar} {}".format(1, 2, bar=4, foo=3)
'3 1 4 2'

還可通過索引來指定要在哪個字段中使用相應的未命名參數宠默,這樣可不按順序使用未命名參數。

>>> "{foo} {1} {bar} {0}".format(1, 2, bar=4, foo=3)
'3 2 4 1'

(2)基本轉換

>>> print("{pi!s} {pi!r} {pi!a}".format(pi="π"))
π 'π' '\u03c0'

上述三個標志(s灵巧、 r和a)指定分別使用str光稼、 repr和ascii進行轉換。函數str通常創(chuàng)建外觀普通的字符串版本(這里沒有對輸入字符串做任何處理)孩等。函數repr嘗試創(chuàng)建給定值的Python表示(這里是一個字符串字面量)艾君。函數ascii創(chuàng)建只包含ASCII字符的表示,類似于Python 2中的repr肄方。
你還可指定要轉換的值是哪種類型河爹,更準確地說搀崭,是要將其視為哪種類型骚勘。例如,你可能提供一個整數逝薪,但將其作為小數進行處理。為此可在格式說明(即冒號后面)使用字符f(表示定點數)

>>> "The number is {num}".format(num=42)
'The number is 42'
>>> "The number is {num:f}".format(num=42)
'The number is 42.000000'
你也可以將其作為二進制數進行處理蝴罪。
>>> "The number is {num:b}".format(num=42)
'The number is 101010

1.2.2 寬度董济、精度、千分位分隔符

寬度是使用整數指定的(默認填充為空格)要门,并且數字默認是右對齊虏肾,字符串默認是右對齊

>>> "{num:10}".format(num=3)
'         3'
>>> "{name:10}".format(name="Bob")
'Bob       '

精度也是使用整數指定的,但需要在它前面加上一個表示小數點的句點欢搜。

>>> "Pi day is {pi:.2f}".format(pi=pi)
'Pi day is 3.14'

當然封豪,可同時指定寬度和精度。

>>> "{pi:10.2f}".format(pi=pi)
'      3.14'

可使用逗號來指出你要添加千位分隔符炒瘟。

>>> 'One googol is {:,}'.format(10**100)
'One googol is 10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000'

1.2.3 符號吹埠、對齊和用0填充

在指定寬度和精度的數前面,可添加一個標志疮装。這個標志可以是零缘琅、加號、減號或空格廓推。其中零表示使用0來填充數字刷袍。

>>> '{:010.2f}'.format(pi)
'0000003.14'
>>> '{:+10.2f}'.format(pi)
'     +3.14'
>>> '{:-10.2f}'.format(pi)
'      3.14'
#在整數數字前面不能指定不能指定0、+受啥、-以外的填充符號
>>> '{:*10.2f}'.format(pi)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid format specifier
Error in sys.excepthook:

要指定左對齊做个、右對齊和居中鸽心,可分別使用<滚局、 >和^。

>>> print('{0:<10.2f}\n{0:^10.2f}\n{0:>10.2f}'.format(pi))
3.14      
   3.14   
      3.14

可以使用填充字符來擴充對齊說明符(將填充字符放在對齊符號的前面)顽频,這樣將使用指定的字符而不是默認的空格來填充藤肢。

>>> "{:$^15}".format(" WIN BIG ")
'$$$ WIN BIG $$$'

還有更具體的說明符=,它指定將填充字符放在符號和數字之間糯景。

>>> print('{0:10.2f}\n{1:10.2f}'.format(pi, -pi))
3.14
>>> print('{0:10.2f}\n{1:10.2f}'.format(pi, -pi))
      3.14
     -3.14
>>> print('{0:10.2f}\n{1:=10.2f}'.format(pi, -pi))
      3.14
-     3.14

如果要給正數加上符號嘁圈,可使用說明符+(將其放在對齊說明符后面)。

#默認情況下蟀淮,正數前無符號最住,負數前有符號
>>> print('{0:>10.2f}\n{1:>10.2f}'.format(pi, -pi)) #默認
      3.14
     -3.14
>>> print('{0:>-10.2f}\n{1:>-10.2f}'.format(pi, -pi)) #默認
      3.14
     -3.14
#可以在正數前加正號來更改默認設置
>>> print('{0:>+10.2f}\n{1:>-10.2f}'.format(pi, -pi))
     +3.14
     -3.14

需要介紹的最后一個要素是井號(#)選項,你可將其放在符號說明符和寬度之間(如果指定了這兩種設置)怠惶。這個選項將觸發(fā)另一種轉換方式涨缚,轉換細節(jié)隨類型而異。例如策治,對于二進制脓魏、八進制和十六進制轉換兰吟,將加上一個前綴。

>>> "{:b}".format(42)
'101010'
>>> "{:#b}".format(42)
'0b101010'
#對于各種十進制數茂翔,它要求必須包含小數點(對于類型g混蔼,它保留小數點后面的零)。
>>> "{:g}".format(42)
'42'
>>> "{:#g}".format(42)
'42.0000

2 常見字符串函數

2.1 center方法

center通過在兩邊添加填充字符(默認為空格)讓字符串居中珊燎。
使用方式:"str".center(para1,para2)惭嚣,其中para1指定顯示字符的寬度,para2指定填充字符俐末,默認為空格料按。

>>> "Center".center(10,'*')
'**Center**'
>>> "Center".center(10)
'  Center  '

2.2 find方法

方法find在字符串中查找子串。如果找到卓箫,就返回子串的第一個字符的索引载矿,否則返回-1。

>>> "hello world".find("world")
6
>>> "hello world".find("aa")
-1

可以使在find中指定起點或同時指定起點和終點烹卒,注意查找范圍不包括終點

>>> subject="$$$ find the string $$$"
>>> subject.find("$$$")
0
>>> subject.find("$$$",1)
20
>>> subject.find("$$$",1,-1)
-1

2.3 join方法

join是一個非常重要的字符串方法闷盔,其作用與split相反,用于合并序列的元素旅急。
使用方式:"連接字符(串)".join(待合并序列)

>>> seq=[1,2,3,4,5]
>>> sep='+'
>>> sep.join(seq)        #無法合并數字序列
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found
>>> seq=['1','2','3','4','5']  #可以合并字符串序列
>>> sep.join(seq)
'1+2+3+4+5'
>>> dir=['','usr','bin','env']
>>> '/'.join(dir)
'/usr/bin/env'
>>> print("C:"+"\\".join(dir))
C:\usr\bin\env

2.4 lower方法

方法lower返回字符串的小寫版本逢勾。

>>> "Hello World".lower()
'hello world'

2.5 replace方法

方法replace將指定子串都替換為另一個字符串,并返回替換后的結果

>>> "this is a cat".replace("is","are")
'thare are a cat'
>>> 

2.6 split方法

split是一個非常重要的字符串方法藐吮,其作用與join相反溺拱,用于將字符串拆分為序列。

>>> "1+2+3+4+5".split("+")
['1', '2', '3', '4', '5']
>>> "hello wold".split()
['hello', 'wold']
>>> "/usr/bin/env".split("/")
['', 'usr', 'bin', 'env']

注意:如果沒有指定分隔符谣辞,將默認在單個或多個連續(xù)的空白字符(空格迫摔、制表符、換行符等)處進行拆分泥从。

2.7 strip方法

方法strip將字符串開頭和末尾的空白(但不包括中間的空白)刪除句占,并返回刪除后的結果。

>>> "  hello world  ".strip()
'hello world'

可在一個字符串參數中指定要刪除哪些字符

>>> '*** SPAM * for * everyone!!! ***'.strip(' *!')
'SPAM * for * everyone'
>>> 
>>> '*** SPAM * for * everyone!!! ***'.strip('*!')
' SPAM * for * everyone!!! '
>>> '*** SPAM * for * everyone!!! ***'.strip('* ')
'SPAM * for * everyone!!!'

2.8 translate方法

方法translate與replace一樣替換字符串的特定部分躯嫉,但不同的是它只能進行單字符替換纱烘。這個方法的優(yōu)勢在于能夠同時替換多個字符,因此效率比replace高祈餐。
這個方法的用途很多(如替換換行符或其他隨平臺而異的特殊字符)擂啥,但這里只介紹一個比較簡單(也有點傻)的示例。假設你要將一段英語文本轉換為帶有德國口音的版本帆阳,為此必須將字符c和s分別替換為k和z哺壶。
然而,使用translate前必須創(chuàng)建一個轉換表。這個轉換表指出了不同Unicode碼點之間的轉換關系变骡。要創(chuàng)建轉換表离赫,可對字符串類型str調用方法maketrans,這個方法接受兩個參數:兩個長度相同的字符串塌碌,它們指定要將第一個字符串中的每個字符都替換為第二個字符串中的相應字符渊胸。就這個簡單的示例而言,代碼類似于下面這樣:
>>> table = str.maketrans('cs', 'kz')
如果愿意台妆,可查看轉換表的內容翎猛,但你看到的只是Unicode碼點之間的映射。

>>> table
{115: 122, 99: 107}

創(chuàng)建轉換表后接剩,就可將其用作方法translate的參數切厘。

>>> 'this is an incredible test'.translate(table)
'thiz iz an inkredible tezt'

調用方法maketrans時,還可提供可選的第三個參數懊缺,指定要將哪些字母刪除疫稿。例如,要模仿語速極快的德國口音鹃两,可將所有的空格都刪除遗座。

>>> table = str.maketrans('cs', 'kz', ' ')
>>> table
{99: 107, 115: 122, 32: None}
>>> 'this is an incredible test'.translate(table)
'thizizaninkredibletezt

2.9 判斷字符串是否滿足特定的條件

  • string.isalnum() 檢查字符串中的字符是否都是字母或數
  • string.isalpha() 檢查字符串中的字符是否都是字母
  • string.isdecimal() 檢查字符串中的字符是否都是十進制數
  • string.isdigit() 檢查字符串中的字符是否都是數字
  • string.isidentifier() 檢查字符串是否可用作Python標識符
  • string.islower() 檢查字符串中的所有字母都是小寫的
  • string.isnumeric() 檢查字符串中的所有字符是否都是數字字符
  • string.isprintable() 檢查字符串中的字符是否都是可打印的
  • string.isspace() 檢查字符串中的字符是否都是空白字符
  • string.istitle() 檢查字符串中位于非字母后面的字母都是大寫的,且其他所有字母都是小寫的
  • string.isupper() 檢查字符串中的字母是否都是大寫的
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末俊扳,一起剝皮案震驚了整個濱河市途蒋,隨后出現的幾起案子,更是在濱河造成了極大的恐慌馋记,老刑警劉巖号坡,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異梯醒,居然都是意外死亡宽堆,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門冤馏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來日麸,“玉大人寄啼,你說我怎么就攤上這事逮光。” “怎么了墩划?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵涕刚,是天一觀的道長。 經常有香客問我乙帮,道長杜漠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮驾茴,結果婚禮上盼樟,老公的妹妹穿的比我還像新娘。我一直安慰自己锈至,他們只是感情好晨缴,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著峡捡,像睡著了一般击碗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上们拙,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天稍途,我揣著相機與錄音,去河邊找鬼砚婆。 笑死械拍,一個胖子當著我的面吹牛,可吹牛的內容都是我干的装盯。 我是一名探鬼主播殊者,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼验夯!你這毒婦竟也來了猖吴?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挥转,失蹤者是張志新(化名)和其女友劉穎海蔽,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體绑谣,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡党窜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了借宵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幌衣。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖壤玫,靈堂內的尸體忽然破棺而出豁护,到底是詐尸還是另有隱情,我是刑警寧澤欲间,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布楚里,位于F島的核電站,受9級特大地震影響猎贴,放射性物質發(fā)生泄漏班缎。R本人自食惡果不足惜蝴光,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望达址。 院中可真熱鬧蔑祟,春花似錦、人聲如沸沉唠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽右冻。三九已至装蓬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纱扭,已是汗流浹背牍帚。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乳蛾,地道東北人暗赶。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像肃叶,于是被迫代替她去往敵國和親蹂随。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容