python字符串和文本

Python CookBook總結(jié)

用Shell 通配符匹配字符串

你想使用Unix Shell 中常用的通配符(比如.py , Dat[0-9].csv 等) 去匹配文
本字符串

>>> from fnmatch import fnmatch, fnmatchcase
>>> fnmatch('foo.txt', '*.txt')
True
>>> fnmatch('foo.txt', '?oo.txt')
True
>>> fnmatch('Dat45.csv', 'Dat[0-9]*')
True
>>> names = ['Dat1.csv', 'Dat2.csv', 'config.ini', 'foo.py']
>>> [name for name in names if fnmatch(name, 'Dat*.csv')]
['Dat1.csv', 'Dat2.csv']

fnmatch() 函數(shù)使用底層操作系統(tǒng)的大小寫敏感規(guī)則(不同的系統(tǒng)是不一樣的) 來(lái)
匹配模式。比如:

>>> # On OS X (Mac)
>>> fnmatch('foo.txt', '*.TXT')
False
>>> # On Windows
>>> fnmatch('foo.txt', '*.TXT')
True

字符串匹配和搜索

如果你想匹配的是字面字符串钉跷,那么你通常只需要調(diào)用基本字符串方法就行

>>> text = 'yeah, but no, but yeah, but no, but yeah'
>>> # Exact match
>>> text == 'yeah'
False
>>> # Match at start or end
>>> text.startswith('yeah')
True
>>> text.endswith('no')
False
>>> # Search for the location of the first occurrence
>>> text.find('no')
10

更復(fù)雜一些答渔,需要使用正則表達(dá)式模塊re

>>> text1 = '11/27/2012'
>>> import re
>>> re.match(r'\d+/\d+/\d+', text1):
>>> datepat = re.compile(r'\d+/\d+/\d+')
>>> datepat.match(text1)
>>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
>>> datepat.findall(text)
['11/27/2012', '3/13/2013']

字符串搜索和替換

對(duì)于簡(jiǎn)單的字面模式勤篮,直接使用str.repalce() 方法即可,比如:

>>> text = 'yeah, but no, but yeah, but no, but yeah'
>>> text.replace('yeah', 'yep')
'yep, but no, but yep, but no, but yep'

對(duì)于復(fù)雜的模式乓旗,請(qǐng)使用re 模塊中的sub() 函數(shù)呵哨。為了說(shuō)明這個(gè),假設(shè)你想將形
式為11/27/2012 的日期字符串改成2012-11-27 为鳄。示例如下:

>>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
>>> import re
>>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
'Today is 2012-11-27. PyCon starts 2013-3-13.'
#如果你打算用相同的模式做多次替換,考慮先編譯它來(lái)提升性能
>>> datepat = re.compile(r'(\d+)/(\d+)/(\d+)')
>>> datepat.sub(r'\3-\1-\2', text)
'Today is 2012-11-27. PyCon starts 2013-3-13.'
#對(duì)于更加復(fù)雜的替換腕让,可以傳遞一個(gè)替換回調(diào)函數(shù)來(lái)代替
>>> from calendar import month_abbr
>>> def change_date(m):
... mon_name = month_abbr[int(m.group(1))]
... return '{} {} {}'.format(m.group(2), mon_name, m.group(3))
...
>>> datepat.sub(change_date, text)
'Today is 27 Nov 2012. PyCon starts 13 Mar 2013.'

如果除了替換后的結(jié)果外孤钦,你還想知道有多少替換發(fā)生了,可以使用re.subn()來(lái)代替记某。比如:

>>> newtext, n = datepat.subn(r'\3-\1-\2', text)
>>> newtext
'Today is 2012-11-27. PyCon starts 2013-3-13.'
>>> n
2

你需要以忽略大小寫的方式搜索與替換文本字符串

>>> text = 'UPPER PYTHON, lower python, Mixed Python'
>>> re.findall('python', text, flags=re.IGNORECASE)
['PYTHON', 'python', 'Python']
>>> re.sub('python', 'snake', text, flags=re.IGNORECASE)
'UPPER snake, lower snake, Mixed snake'

最短匹配模式

#*是貪婪的,會(huì)盡可能多的匹配
>>> str_pat = re.compile(r'\"(.*)\"')
>>> text1 = 'Computer says "no."'
>>> str_pat.findall(text1)
['no.']
>>> text2 = 'Computer says "no." Phone says "yes."'
>>> str_pat.findall(text2)
['no." Phone says "yes.']
#?是不貪婪的构捡,盡可能少的匹配
>>> str_pat = re.compile(r'\"(.*?)\"')
>>> str_pat.findall(text2)
['no.', 'yes.']

字符串對(duì)齊

#使用字符串的ljust() , rjust() 和center()方法
>>> text = 'Hello World'
>>> text.ljust(20)
'Hello World '
>>> text.rjust(20)
' Hello World'
>>> text.center(20)
' Hello World '
>>> text.rjust(20,'=')
'=========Hello World'
>>> text.center(20,'*')
'****Hello World*****'
#函數(shù)format() 同樣可以用來(lái)很容易的對(duì)齊字符串液南。
#你要做的就是使用<,> 或者? 字符后面緊跟一個(gè)指定的寬度。
>>> format(text, '>20')
' Hello World'
>>> format(text, '<20')
'Hello World '
>>> format(text, '^20')
' Hello World '
>>> format(text, '=>20s')
'=========Hello World'
>>> format(text, '*^20s')
'****Hello World*****'

以指定列寬格式化字符串

s = "Look into my eyes, look into my eyes, the eyes, the eyes, \
the eyes, not around the eyes, don't look around the eyes, \
look into my eyes, you're under."
>>> import textwrap
>>> print(textwrap.fill(s, 70))
Look into my eyes, look into my eyes, the eyes, the eyes, the eyes,
not around the eyes, don't look around the eyes, look into my eyes,
you're under.
>>> print(textwrap.fill(s, 40))
Look into my eyes, look into my eyes,
the eyes, the eyes, the eyes, not around
the eyes, don't look around the eyes,
look into my eyes, you're under.
>>> print(textwrap.fill(s, 40, initial_indent=' '))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末勾徽,一起剝皮案震驚了整個(gè)濱河市滑凉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喘帚,老刑警劉巖畅姊,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吹由,居然都是意外死亡若未,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門倾鲫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粗合,“玉大人,你說(shuō)我怎么就攤上這事乌昔∠毒危” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵磕道,是天一觀的道長(zhǎng)供屉。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么伶丐? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任悼做,我火速辦了婚禮,結(jié)果婚禮上撵割,老公的妹妹穿的比我還像新娘贿堰。我一直安慰自己,他們只是感情好啡彬,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布羹与。 她就那樣靜靜地躺著,像睡著了一般庶灿。 火紅的嫁衣襯著肌膚如雪纵搁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天往踢,我揣著相機(jī)與錄音腾誉,去河邊找鬼。 笑死峻呕,一個(gè)胖子當(dāng)著我的面吹牛利职,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘦癌,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼猪贪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了讯私?” 一聲冷哼從身側(cè)響起热押,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斤寇,沒(méi)想到半個(gè)月后桶癣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娘锁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年牙寞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莫秆。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碎税,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馏锡,到底是詐尸還是另有隱情雷蹂,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布杯道,位于F島的核電站匪煌,受9級(jí)特大地震影響责蝠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萎庭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一霜医、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驳规,春花似錦肴敛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捻勉,卻和暖如春镀梭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背踱启。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工报账, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埠偿。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓透罢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冠蒋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羽圃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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