Python 實用程式設計技巧(字串篇)
1.如何拆分含有多種分隔符的字串
(1)我們首先考慮單一分隔符的情況:
s = “10800 1 10800 10800 ? 197609 14:12:16 /usr/bin/mintty”
我們使用字串的 split()方法
s = "10800 1 10800 10800 ? 197609 14:12:16 /usr/bin/mintty"
print s.split()
有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~
(2)多重分隔符
方法一:既然split() 這個函式每次只能匹配一個,那我們可以弄一個迴圈
def mySplit(s,ds):
res = [s]
for d in ds:
t = []
map(lambda x:t.extend(x.split(d)),res)
res = t
return t
s = 'asb,ksh|aw.mwdn/zxcm?xmcin<zxc'
ds = ',|./?<'
print mySplit(s,ds)
這種情況下如果出現連續的兩個分隔符的話,結果就會多出一個空白,我們最好還加一個過濾
def mySplit(s,ds):
res = [s]
for d in ds:
t = []
map(lambda x:t.extend(x.split(d)),res)
res = t
return [x for x in t if x]
s = 'asb,ksh|aw.mwdn/zxcm??xmcin<zxc'
ds = ',|./?<'
print mySplit(s,ds)
方法二:使用 re.split() 正則匹配函式,一次性完成
import re s = 'asb,ksh|aw.mwdn/zxcm??xmcin<zxc' print re.split(r'[,|./?<]+',s)
2.如何判斷字串a以字串b開頭或者結尾
使用字串的 startwith 和 endwith
比如我們需要找出當前目錄下的一以 java 、php 、log 結尾的檔案,並去除一部分許可權
import os,stat
s = [x for x in os.listdir('.') if x.endswith(('log','java','php'))]
a = map(lambda i:oct(os.stat(i).st_mode),s)
map(lambda i:os.chmod(i,stat.S_IXOTH),s)
b = map(lambda i:oct(os.stat(i).st_mode),s)
print a
print b
結果:
['0100666', '0100666', '0100666']
['0100444', '0100444', '0100444']
3.如何調整字串中文字的格式
比如我們有這樣的需求,將日誌檔案中的本來的年月日格式:2018-01-02 全部替換成 01/02/2018 這樣的格式
我們使用正則表示式 re.sub()
import re
s = open("./test.log").read()
print re.sub('(\d{4})-(\d{2})-(\d{2})',r'\2/\3/\1',s)
4.如何將一個小字串拼接成一個大字串
方法一:使用 + 拼接兩個字串
str1 = "111"
str2 = "222"
print str1+str2
這裡說一下,其實這個+是字串自帶的方法,是 __add__
的過載,相當於執行了
srr.__add__(str1,str2)
如果字串在一個列表中的話:
l = ["zxc","zzzz","weqe","1231","<><>","[][]"]
print reduce(lambda x,y:x+y,l)
方法二:使用join 方法
join 能傳入一個可迭代物件
l = ["zxc","zzzz","weqe","1231","<><>","[][]"]
print ";".join(l)
結果:
zxc;zzzz;weqe;1231;<><>;[][]
注意:
如果我們的列表裡面不只有字串還有數字型別怎麼辦?
方法一:我們使用列表解析
pl = [123,"xxx",456,"dasdafa"]
print "".join([str(x) for x in pl])
但是這種方法會產生一個新的列表,如果列表很長的胡話就會非常耗費資源,於是有了方法二
方法二:使用生成器
不加[]的列表解析語句會生成一個生成器
pl = [123,"xxx",456,"dasdafa"]
print "".join(str(x) for x in pl)
5.如何對字串進行了左右居中的對齊
方法一:使用字串的 str.ljust(),str.rjust(),str.center()方法
s = "asd"
print s.ljust(20)
print s.ljust(20,"=")
print s.center(20)
print s.center(20,"=")
print s.rjust(20)
print s.rjust(20,"=")
結果:
asd
asd=================
asd
========asd=========
asd
=================asd
方法二:使用內建的字串格式化方法—-format
s = "asd"
print format(s,"<20")
print format(s,">20")
print format(s,"^20")
結果:
asd
asd
asd
6.去掉字串中不需要的字元
舉例幾個可能的情況
- 我們需要去掉字串兩邊的空白符
- 我們需要將Windows 下的換行符\r\n,轉換成 Linux 下的換行符 \n
- 我們需要去掉拼音中的音調
方法一:strip() 、lstrip() 、 rstrip()
s = " dasda asda "
print s.strip()
lstrip() 、 rstrip() 同理,我就不再舉例
現在如果是 “—–asda adadad+++++”這種字串的話,我們依然能用 strip()
s = "-----adada asdada++++"
print s.strip("-+")
方法二:使用切片加 +(拼接)刪除固定位置的字元
s = "asdb:213"
print s[:4]+s[5:]
方法三:字串的replace()或者 re.sub()
s = "\tasd\t123\t789"
print s.replace("\t","")
如果有多個需要替換的話建議使用正則表示式 re.sub()
import re
s = "asd,asqw\tzxc|"
print re.sub('[,\t|]',"",s)
方法四:字串的translate 方法來替換多個字元
先來介紹一下 translate
translate 是對映功能,可以根據對映表來將字元替換
首先建立一個對映表
import string
string.maketrans('abcxyz','xyzabc')
意思是將 abcxyz 對映為 xyzabc
然後就是根據對映表來操縱字串
import string
string.maketrans('abcxyz','xyzabc')
s = "abc9790907xyz"
print s.translate(string.maketrans('abcxyz','xyzabc'))
translate 除了能根據對映替換字元以外,當你第一個引數傳遞為 None 的時候,第二個引數可以傳遞逆向刪除的字元的自負串
s = "asd/afji,1231\tzzz\r\n"
print s.translate(None,',/\t\r\n')
補充:如何去除標點
標點實際上是 unicode 的一個組合字元
s = u’ni\u0301 ha\u030co,chi\u0304 fa\u0300n’
我們主要是利用 unicode 的 translate 方法,它傳入一個字典
s = u'ni\u0301 ha\u030co,chi\u0304 fa\u0300n'
print s.translate(dict.fromkeys([0x0301,0x030c,0x0304,0x0300]))
有需要Python學習資料的小夥伴嗎?小編整理【一套Python資料、原始碼和PDF】,感興趣者可以加學習群:548377875或者加小編微信:【mmp9972】反正閒著也是閒著呢,不如學點東西啦~~