歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python進階強化訓練之字符串處理技巧

Python進階強化訓練之字符串處理技巧

日期:2017/3/1 9:12:05   编辑:Linux編程

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

  • 實際案例

我們要把某個字符串依據分隔符號拆分不同的字符段,該字符串包含多種不同的分隔符,例如:

s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd'

其中<,>,<;>,<|>,<\t>都是分隔符,如何處理?

解決方案

  • 連續使用split()方法,每次處理一種分隔符
# 使用Python2
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 res if x]

s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd'
result = mySplit(s, ';,|\t')
print(result)
C:\Users\Administrator>C:\Python\Python27\python.exe E:\python-intensive-training\s2.py
['asd', 'aad', 'dasd', 'dasd', 'sdasd', 'asd', 'Adas', 'sdasd', 'Asdasd', 'd', 'asd']
  • 使用正則表達式的re.split()方法,一次性拆分字符串
>>>import re
>>>re.split('[,;\t|]+','asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd')
['asd', 'aad', 'dasd', 'dasd', 'sdasd', 'asd', 'Adas', 'sdasd', 'Asdasd', 'd', 'asd']

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

  • 實際案例

如某目錄有如下文件:

quicksort.c
graph.py
heap.java
install.sh
stack.cpp
......

現在需要給.sh.py結尾的文件夾上可執行權限

解決方案

  • 使用字符串的startswith()endswith()方法
>>> import os, stat
>>> os.listdir('./')
['heap.java', 'quicksort.c', 'stack.cpp', 'install.sh', 'graph.py']
>>> [name for name in os.listdir('./') if name.endswith(('.sh','.py'))] 
['install.sh', 'graph.py']
>>> os.chmod('install.sh', os.stat('install.sh').st_mode | stat.S_IXUSR)
[root@iZ28i253je0Z t]# ls -l install.sh 
-rwxr--r-- 1 root root 0 Sep 15 18:13 install.sh

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

  • 實際案例

某軟件的日志文件,其中日期格式為yyy-mm-dd:

2016-09-15 18:27:26 statu unpacked python3-pip:all
2016-09-15 19:27:26 statu half-configured python3-pip:all
2016-09-15 20:27:26 statu installd python3-pip:all
2016-09-15 21:27:26 configure asdasdasdas:all python3-pip:all

需要把其中日期改為美國日期的格式mm/dd/yyy,2016-09-15 --> 09/15/2016,要如何處理?

解決方案

  • 使用正則表達式re.sub()方法做字符串替換

利用正則表達式的捕獲組,捕獲每個部分內容,在替換字符串中各個捕獲組的順序。

>>>log = '2016-09-15 18:27:26 statu unpacked python3-pip:all'
>>>import re
# 按順序
>>>re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1' , log)
'09/15/2016 18:27:26 statu unpacked python3-pip:all'
# 使用正則表達式的分組
>>>re.sub('(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})', r'\g<month>/\g<day>/\g<year>' , log)
'09/15/2016 18:27:26 statu unpacked python3-pip:all'

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

  • 實際案例

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

hwDetect:       "<0112>"
gxDepthBits:    "<32>"
gxResolution:   "<1024x768>"
gxRefresh:      "<60>"
fullAlpha:      "<1>"
lodDist:        "<100.0>"
DistCull:       "<500.0>"

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

["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]

最終我們要把各個參數拼接成一個數據包進行發送:

"<0112><32><1024x768><60><1><100.0><500.0>"

結局方案

  • 迭代列表,連續使用'+'操作依次拼接每一個字符串
>>> for n in ["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]:
...  result += n
...
>>> result
'<0112><32><1024x768><60><1><100.0><500.0>'
  • 使用str.join()方法,更加快速的拼接列表中所有字符串
>>> result = ''.join(["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"])
>>> result
'<0112><32><1024x768><60><1><100.0><500.0>'

如果列表中有數字,可以使用生成器進行轉換:

>>>hello = [222,'sd',232,'2e',0.2]
>>>''.join(str(x) for x in hello)
'222sd2322e0.2'

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

  • 實際案例

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

{
  'ip':'127.0.0.1',
  'blog': 'www.anshengme.com',
  'title': 'Hello world',
  'port': '80'
}

在程序中,我們想以以下格式將其內容輸出,如何處理?

ip    : 127.0.0.1 
blog  : www.anshengme.com 
title : Hello world 
port  : 80 

解決方案

  • 使用字符串的str.ljust(),str.rjust,str.cente()進行左右居中對齊
>>>info = {'ip':'127.0.0.1','blog': 'www.anshengme.com','title': 'Hello world','port': '80'}
# 獲取字典中的keys最大長度
>>>max(map(len, info.keys()))
5
>>>w = max(map(len, info.keys()))
>>>for k in info:
...   print(k.ljust(w), ':',info[k])
...
# 獲取到的結果
port  : 80
blog  : www.anshengme.com
ip    : 127.0.0.1
title : Hello world
  • 使用format()方法,傳遞類似'<20','>20','^20'參數完成同樣任務
>>>for k in info:
...   print(format(k,'^'+str(w)), ':',info[k])
...
port  : 80
blog  : www.anshengme.com
 ip   : 127.0.0.1
title : Hello world

如何去掉字符串中不需要的字符?

  • 實際案例
  1. 過濾掉用戶輸入卡後多余的空白字符: [email protected]
  2. 過濾某windows下編輯文本中的'\r': hello word\r\n
  3. 去掉文本中的unicode組合符號(音調): 'ní hǎo, chī fàn'

解決方案

  • 字符串strip(),lstrip(),rstrip()方法去掉字符串兩端字符
>>>email = '  [email protected]     '
>>>email.strip()
'[email protected]'
>>>email.lstrip()
'[email protected]     '
>>>email.rstrip()
'  [email protected]'
>>>
  • 刪除某個固定位置的字符,可以使用切片+拼接的方法
>>>s[:3] + s[4:]
'abc123'
  • 字符串的replace()方法或正則表達式re.sub()刪除任意位置字符
>>>s = '\tabc\t123\txyz'
>>>s.replace('\t', '')
'abc123xyz'

使用re.sub()刪除多個

>>>import re
>>>re.sub('[\t\r]','', string)
'abc123xyzopq'
  • 字符串translate()方法,可以同時刪除多種不同字符
>>>import string
>>>s = 'abc123xyz'
>>>s.translate(string.maketrans('abcxyz','xyzabc'))                    
'xyz123abc'
>>>s = '\rasd\t23\bAds'
>>>s.translate(None, '\r\t\b')                                     
'asd23Ads'
# python2.7
>>>i = u'ní hǎo, chī fàn'
>>>i
u'ni\u0301 ha\u030co, chi\u0304 fa\u0300n'
>>>i.translate(dict.fromkeys([0x0301, 0x030c, 0x0304, 0x0300]))
u'ni hao, chi fan'

Ubuntu 14.04安裝Python 3.3.5 http://www.linuxidc.com/Linux/2014-05/101481.htm

CentOS上源碼安裝Python3.4 http://www.linuxidc.com/Linux/2015-01/111870.htm

《Python核心編程 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm

在Ubuntu下用Python搭建桌面算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm

Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm

Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved