1. 程式人生 > >Python 實用程式設計技巧(字串篇)

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.去掉字串中不需要的字元

舉例幾個可能的情況

  1. 我們需要去掉字串兩邊的空白符
  2. 我們需要將Windows 下的換行符\r\n,轉換成 Linux 下的換行符 \n
  3. 我們需要去掉拼音中的音調

方法一: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】反正閒著也是閒著呢,不如學點東西啦~~