python進階:字符串和文本處理

字符串是一種重要的數(shù)據(jù)形式,有價值的程序都會涉及到對于字符串的處理。幸運的是须教,強大的python內(nèi)置了很多函數(shù),來幫助我們解析和處理字符串斩芭。本文會涉及到字符串編碼轻腺,簡單的字符串處理函數(shù)。

字符串編碼

在 Python3 中划乖,文本總是 Unicode, 由 str 類型進行表示贬养,二進制數(shù)據(jù)使用 bytes 進行表示。不會出現(xiàn)python2種將 str 與 bytes 偷偷的混在一起的情況琴庵,使得兩者的區(qū)別更加明顯[1]误算。

我們知道仰美,計算機儲存的都是二進制信息,二進制信息有很多種編碼方式來表示字符儿礼,有的編碼方式叫BIG-5咖杂,有的編碼方式叫GBK,有的編碼方式叫UTF-8蚊夫,不一而足诉字。

在python3中,默認的編碼方式是UTF-8这橙。python內(nèi)置了可以處理字符串的decode()函數(shù)和encode()函數(shù)奏窑,decode()函數(shù)將其它編碼的字符串轉(zhuǎn)化為UTF-8导披,encode()函數(shù)將UTF-8編碼轉(zhuǎn)化為其它編碼[2]屈扎。

拼接字符串

使用+拼接少量字符串,形式簡潔撩匕,速度很快鹰晨。比如:

>>> string_1 = "Hello"
>>> string_2 = "World"
>>> string = string_1 + string_2
>>> print(string)
HelloWorld

對于已知值的字符串,可以依次打出其值并賦值給一個字符串變量止毕,也可以實現(xiàn)字符串的連接模蜡。

# 無需加號的連接
>>> string_3 = "Hello" "World"
>>> print(string_3)
HelloWorld

隨著字符串?dāng)?shù)量的增多,字符串連接的效率會迅速降低[3]扁凛。這時就需要使用join()方法忍疾,它本質(zhì)上是一個函數(shù)。join()是專屬于字符串的一種方法谨朝,字符串后面只要加上一個點卤妒,就能夠使用該方法。

>>> parts = ['Is', 'Chicago', 'Not', 'Chicago?']
# 用空格連接
>>> ' '.join(parts)
'Is Chicago Not Chicago?'
# 用逗號連接
>>> ','.join(parts)
'Is,Chicago,Not,Chicago?'
# 不使用任何字符字币,直接連接
>>> ''.join(parts)
'IsChicagoNotChicago?'

多個需要連接的字符串则披,一般會放在列表里面。然后使用join()方法連接洗出。注意士复,在','.join(parts)中,parts表示待連接的字符串翩活,逗號意味著:每個字符串之間用逗號連接阱洪。

拆分字符串

字符串的分割需要用到split()方法,它也是python的內(nèi)置函數(shù)菠镇,專門用于拆分字符串冗荸。函數(shù)split()只接受一個參數(shù),這個參數(shù)決定了字符串應(yīng)該在何處拆分辟犀。

>>> line = 'Is Chicago Not Chicago?'
# 用逗號分隔
>>> parts = line.split(' ')
>>> print(parts)
['Is', 'Chicago', 'Not', 'Chicago?']
# 拆分和連接是互逆的俏竞,先拆分后連接绸硕,還是原來的字符串
>>> ' '.join(line.split(' ')) == line
True

如果想在多個字符處分隔應(yīng)該怎么辦呢?聰明的你不難想到魂毁,多次使用split()方法玻佩,每次使用不同的字符。具體見下面的例子:

現(xiàn)在我們還沒有學(xué)到列表連接的方法席楚,暫且使用+咬崔。和字符串的連接類似,用+連接列表也會有性能問題烦秩,這時需要用到append()方法垮斯,感興趣的同學(xué)可以查閱相關(guān)資料。

首尾字符過濾

首尾字符過濾用strip()方法只祠,strip()默認過濾掉空格' '和換行`\n``兜蠕,也可以指定過濾的字符。具體可以看下面的例子:

# 默認過濾首尾空格和換行符號
>>> line = '  Hello, world!  \n'
>>> line.strip()
'Hello, world!'

# 過濾掉'?'
>>> line = 'Is Chicago Not Chicago?'
>>> line.strip('?')
'Is Chicago Not Chicago'

字符的查找和替換

查找的方法是find()抛寝,用法和上面的類似熊杨,具體用法請看下面的例子。

>>> line = 'Hello, world!\n'
>>> line.find('o')
4

123find()方法盗舰,從字符串的開頭開始尋找目標(biāo)字符晶府,遇到第一個符合的字母就停止尋找,并返回該字符的序號钻趋。

# 根據(jù)空格和字母c川陆,拆分字符串line
>>> line = 'Is Chicago Not Chicago?'
>>> part_1 = line.split(' ')
>>> print(part_1)
['Is', 'Chicago', 'Not', 'Chicago?']
>>> part_2 = []
>>> for index in part_1:
···     part_2 = part_2 + index.split('c')
>>> print(part_2)
['Is', 'Chi', 'ago', 'Not', 'Chi', 'ago?']

替換的方法是:replace(),基本的使用格式是:字符串.replace(參數(shù)1, 參數(shù)2)蛮位,參數(shù)1表示要被替換的字符较沪,參數(shù)2表示替換成的字符。具體見下面的例子:

>>> line = 'Hello, world!\n'
>>> line.replace('\n', '\r')
'Hello, world!\n'

# 一次性替換全部
>>> line.replace('o', 'a')
'Hella, warld!\n'

replace()方法不是惰性的土至,它會把所有符合條件的字符都替換成目標(biāo)字符购对。

總結(jié)

  1. python3默認編碼是UTF-8,其它編碼轉(zhuǎn)換成UTF-8需要使用decode()方法
  2. 少量拼接使用+陶因,大量字符串拼接需要使用join()方法
  3. 拆分字符串需要使用split()方法骡苞,可以自定義拆分的基準(zhǔn)字符
  4. strip()可以實現(xiàn)過濾首尾的特定字符,默認過濾空格和換行
  5. 字符的查找和替換分別使用find()replace()方法

思考


# 根據(jù)一種字符串分隔字符只需要用split()方法
# 兩次使用split()方法也可以實現(xiàn)按兩種字符分隔字符串
# 請編寫一個函數(shù)楷扬,將任意一個字符串按任意兩個字符分隔
# 比如輸入字符串:'Hello, welcome to congge python'
# 分隔參數(shù):空格和英文逗號
# 輸出:['Hello', 'welcome', 'to', 'congge', 'python']

def my_split(string, character1, character2):
    array = string.split(character1)
    output = []
    for i in array:
        output = output + i.split(character2)
    return output

參考資料

  1. 《Python 2與Python 3版本和編碼的對比》原文鏈接:http://www.jb51.net/article/105518.htm
  2. 《Python字符串的編碼與解碼》原文鏈接:http://blog.csdn.net/qq_15437667/article/details/52719297
  3. 《合并拼接字符串》原文鏈接:http://python3-cookbook-zh.readthedocs.io/en/latest/c02/p14_combine_and_concatenate_strings.html

掃一掃這個二維碼解幽,關(guān)注公眾號:聰哥python,獲取最新python3基礎(chǔ)教程

聰哥python

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烘苹,一起剝皮案震驚了整個濱河市躲株,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镣衡,老刑警劉巖霜定,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件档悠,死亡現(xiàn)場離奇詭異,居然都是意外死亡望浩,警方通過查閱死者的電腦和手機辖所,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磨德,“玉大人缘回,你說我怎么就攤上這事〉涮簦” “怎么了酥宴?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長您觉。 經(jīng)常有香客問我拙寡,道長,這世上最難降的妖魔是什么顾犹? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任倒庵,我火速辦了婚禮,結(jié)果婚禮上炫刷,老公的妹妹穿的比我還像新娘。我一直安慰自己郁妈,他們只是感情好浑玛,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著噩咪,像睡著了一般顾彰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胃碾,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天涨享,我揣著相機與錄音,去河邊找鬼仆百。 笑死厕隧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俄周。 我是一名探鬼主播吁讨,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼峦朗!你這毒婦竟也來了建丧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤波势,失蹤者是張志新(化名)和其女友劉穎翎朱,沒想到半個月后橄维,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡拴曲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年挣郭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疗韵。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡兑障,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蕉汪,到底是詐尸還是另有隱情流译,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布者疤,位于F島的核電站福澡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驹马。R本人自食惡果不足惜革砸,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望糯累。 院中可真熱鬧算利,春花似錦、人聲如沸泳姐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胖秒。三九已至缎患,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阎肝,已是汗流浹背挤渔。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留风题,地道東北人判导。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像俯邓,于是被迫代替她去往敵國和親骡楼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容