Python高效編程技巧筆記(二)字符串處理相關問題與解決技巧

1.如何拆分含有多種分隔符的字符串

實際案例:

咱們要把某字符串依據分割符號拆分不一樣的字段,該字符串包含多種不一樣的分隔符,例如: s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz' 其中<,>,<;>,<|>,<\t>都是分割符號,如何處理?java

解決方案:

方法1:連續使用str.split()方法,每次處理一種分割符號python

方法2: 使用正則表達式的re.split()方法,推薦.正則表達式

s='ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz'
s.split('|,;')
s.split(';')
[ss.split('|') for ss in s.split(';')]
list(map(lambda ss:ss.split('|'),s.split(';')))
t=[]
t.extend([1,2,3])
t.extend([4,5,6])
map(t.extend())
[ss.split('|') for ss in s.split(';')]
sum([ss.split('|') for ss in s.split(';')],[])

def my_split(s,seps):
    res=[s]
    for sep in seps:
        t=[]
        list(map(lambda ss: t.extend(ss.split(sep)),res))
        res=t
    return res
my_split(s,',;|\t')

from functools import reduce
reduce(lambda l, sep:sum(map(lambda ss:ss.split(sep),1),[]),',;|\t',[s]
my_splits== lambda s,seps:reduce(lambda l, sep:sum(map(lambda ss:ss.split(sep),1),[]),seps,[s]

複製代碼

2.如何判斷字符串a是否以字符串b開頭或結尾

研討問題:

如何判斷字符串a是否以字符串b開頭或結尾?bash

實際案例:

某文件目錄下有一系列文件:服務器

quicksort.c
 
 graph.p
 
 heap.java
 
 install.sh
 
 stack.cpp
複製代碼

編寫程序給其中全部.sh文件和.py文件加上用戶可執行權限.網絡

解決方案:

使用str.startswith()str.endswith()方法(注意:多個匹配時參數使用元組)ui

fn='aaa.py'
fn.endswith('.py')
fn.endswith('.sh','.py')
import os 
os.listdir('.')
s=os.stat('b.py')
s.st_mode|0o100
oct(s.st_mode|0o100)
od.chmod('b.py',s.st_mode |0o100)

import stat
stat.S_IXUSR
for fn in os.listdir():
    if fn.endswith('.py','.sh')
    fs=os.stat(fn)
    os.chmod(fn,fs.st_mode | stat.S_IXUSR)
複製代碼

3.如何調整字符串中文本的格式

研討問題:

如何調整字符串中文本的格式?spa

實際案例:

某軟件的logo文件,其中的日期格式爲'yyyy-mm-dd' 咱們想把其中日期改成美國日期的格式'mm/dd/yyyy'. 2019-07-23'=>'07/23/2019',如何處理?設計

解決方案:

使用正則表達式re.sub()方法作字符串替換,利用正則表達式的捕獲組,捕獲每部分的內容,在替換字符串中調整各個捕獲組的順序.code

ls /var/log
cat/var/log/dpkg.log.1
f=open('/var/log/dpkg.log.1')
log=f.read()

import re
re.sub(p,r,s)
print(re.sub(r'(\d{4})-(\d{2})-(\d{2})',r'\2/\3/\1',log))
print(re.sub(r'(?P<d>\d{4})-(?P<m>\d{2})-(?P<y>\d{2})',r'\g<m>/\g<y>',log))

複製代碼

4.如何調整字符串將多個小字符串拼接成一個大字符串

研討問題:

如何將一個小字符串拼接成一個大字符串?

實際案例:

在設計網絡程序時,咱們自定義了一個基於UDP的網絡協議,按照固定次序向服務器傳遞一系列參數:

hwdetect:   "<0112>"

gxDepthBits:  "<32>"

gxResolution:   "<1024*768>"

gcRefresh:      "<60>"" fullAlpha: "<1>" lodDist: "<100>" DistCall: "<500>" 複製代碼

在程序中咱們將各個參數按次序收集到列表中:

["<0112>","<32>","<1024>","<60>","<1>,"<100.00>","<500.00>"]

最終咱們要把各個參數拼接成一個數據進行報送.

"<0112><32><1024><60><1><100><500>"

解決方案:

方法一:迭代列表,連續使用"+"操做依次拼接每個字符串.

方法二:使用str.join()方法,更加快速的拼接列表中全部字符串.

l=["<0112>"","<32>","<1024>","<60>","<1>,"<100.00>","<500.00>"]
s=''
for x in l:
    s+=x
s.join(iterable)->str
timeit ''.join(l)
timeit reduce(str.__add__,1)
複製代碼

5.如何對字符串進行左,右,居中對齊

實際案例:

某個字典存儲了一系列屬性值: {

"lodDist":100.00,
    "SmallCull":0.04,
    "DistCull":500.00,
    "trilinear":40,
    "farclip":477,
複製代碼

} 在程序中,咱們想以工整數的格式將其內容輸出,如何處理?

lodDist:100.00,
    SmallCull:0.04,
    DistCull:500.00,
    trilinear:40,
    farclip:477,
複製代碼

解決方案:

方法一:使用字符串的str.ljust(),str.rjust(),str.center()進行左右中對齊》

方法二:使用format方法,傳遞相似'<20>,'>20','^20'參數完成一樣任務.

s='abc'
s.ljust(10)
'abc '
s.rjust(10)
' abc'
format(s,'<10')
format(s,'>10')
format(s,'^10')
format(123,'+')
format(-123,'+')
format(-123,'>+10'
format(-123,'=+10')
format(-123,'0=+10')
format(+546,'0=+10')
d={ 'lodDist':100.00,'SmallCull':0.04,'DistCull':500.00,'trilinear':40,'farclip':477,}
w=max(map(len,d.keys()))
for k,v in d.items():
    print(k.ljust(w),':',v)
    
複製代碼

6.如何字符串中不須要的字符

研討問題:

如何去掉字符串不須要的字符?

實際案例:

1.過濾掉用戶輸入中先後多餘的空白字符:

' nick2008@gmail.com'

2.過濾某Windows下編輯文本中的'\r':

'hello world\r\n'

3.去掉文本中的Unicode組合符號:

''ni há,chǐ fán''

解決方案:

方法一:字符串strip(),lstrip(),rstrip()方法去掉字符串的兩端字符.

s=' hellowowd'
s.strip()
s.lstrip()
s.rstrip()

複製代碼

方法二:刪除單個位置的字符,能夠使用切片+拼接的方式.

s2='abc:1234'
s2[:3]+s2[4:]
'abc1234'
複製代碼

方法三:字符串的replace()方法或者正則表達式re.sub()刪除任意字符串

s3=' abc xyz '
  s3.replace()
s3=' \t abc \t,xtz'
import re
re.sub('[ \t\n]','',s3)
複製代碼

方法四:字符串的translate()方法,能夠刪除多種不一樣字符

s='abc1234xyz'
s.translate({ord('a'):'X'})
s.maketrans('abcxyz','XYZABC')
s.translate(s.maketrans('abcxyz','XYZABC'))
s.translate({ord('a'):None})
複製代碼

案例4:

s4='ni há,chǐ fán'
c=á
len(c)
import unicodedata
unicodedata.combining(c[1])
[ord(c) for c in s4 if unicodedata.combining(c)]
dict.formkeys([ord(c) for c in s4 if unicodedata.combining(c)],None)
s4.translate(dict.formkeys([ord(c) for c in s4 if unicodedata.combining(c)],None))
複製代碼

字符串的分割,拼接,去空格字符,能夠用的方法有split(),replace(),translate(),format(),strip()...

相關文章
相關標籤/搜索