99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Python開發(fā)中不得不知的字符串處理技巧

發(fā)布時間:2016-10-08 18:10  回復(fù):0  查看:2385   最后回復(fù):2016-10-08 18:10  

python開發(fā)中,我們常常需要對字符串進(jìn)行處理,那如何拆分含有多種分隔符的字符串呢?下面我們通過一些實例來和大家分享下吧。

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

  實際案例

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

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

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

  解決方案

  連續(xù)使用 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']

  使用正則表達(dá)式的 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開頭或結(jié)尾?

  實際案例

  如某目錄有如下文件:

  quicksort.c

  graph.py

  heap.java

  install.sh

  stack.cpp

  ......

  現(xiàn)在需要給 .sh 和 .py 結(jié)尾的文件夾上可執(zhí)行權(quán)限

  解決方案

  使用字符串的 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

  如何調(diào)整字符串中文本的格式?

  實際案例

  某軟件的日志文件,其中日期格式為 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 ,要如何處理?

  解決方案

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

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

  >>> 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'

  使用正則表達(dá)式的分組

  >>> re.sub('(?P\d{4})-(?P\d{2})-(?P\d{2})', r'\g/\g/\g' , log)

  '09/15/2016 18:27:26 statu unpacked python3-pip:all'

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

  實際案例

  在設(shè)計某網(wǎng)絡(luò)程序時,我們自定義了一個基于 UDP 的網(wǎng)絡(luò)協(xié)議,按照固定次序向服務(wù)器傳遞一系列參數(shù):

  hwDetect: "<0112>"

  gxDepthBits: "<32>"

  gxResolution: "<1024x768>"

  gxRefresh: "<60>"

  fullAlpha: "<1>"

  lodDist: "<100.0>"

  DistCull: "<500.0>"

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

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

  最終我們要把各個參數(shù)拼接成一個數(shù)據(jù)包進(jìn)行發(fā)送:

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

  結(jié)局方案

  迭代列表,連續(xù)使用 '+' 操作依次拼接每一個字符串

  >>> 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>'

  如果列表中有數(shù)字,可以使用生成器進(jìn)行轉(zhuǎn)換:

  >>> hello = [222,'sd',232,'2e',0.2]

  >>> ''.join(str(x) for x in hello)

  '222sd2322e0.2'

  如何對字符串進(jìn)行左居中對齊?

  實際案例

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

  {

  'ip':'127.0.0.1',

  'blog': 'www.anshengme.com',

  'title': 'Hello world',

  'port': '80'

  }

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

  ip : 127.0.0.1

  blog : www.anshengme.com

  title : Hello world

  port : 80

  解決方案

  使用字符串的 str.ljust() , str.rjust , str.cente() 進(jìn)行左右居中對齊

  >>> 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])

  ...

  獲取到的結(jié)果

  port : 80

  blog : www.anshengme.com

  ip : 127.0.0.1

  title : Hello world

  使用 format() 方法,傳遞類似 '<20>20' , '^20' 參數(shù)完成同樣任務(wù)

  >>> 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

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

  實際案例

  過濾掉用戶輸入卡后多余的空白字符: anshengm.com@gmail.com

  過濾某windows下編輯文本中的'\r': hello word\r\n

  去掉文本中的unicode組合符號(音調(diào)): 'ni? ha?o, chi? fa?n'

  解決方案

  字符串 strip() , lstrip() , rstrip() 方法去掉字符串兩端字符

  >>> email = ' anshengm.com@gmail.com '

  >>> email.strip()

  'anshengm.com@gmail.com'

  >>> email.lstrip()

  'anshengm.com@gmail.com '

  >>> email.rstrip()

  ' anshengm.com@gmail.com'

  >>>

  刪除某個固定位置的字符,可以使用切片+拼接的方法

  >>> s[:3] + s[4:]

  'abc123'

  字符串的 replace() 方法或正則表達(dá)式 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'ni? ha?o, chi? fa?n'

  >>> i

  u'ni\u0301 ha\u030co, chi\u0304 fa\u0300n'

  >>> i.translate(dict.fromkeys([0x0301, 0x030c, 0x0304, 0x0300]))

  u'ni hao, chi fan'

 

 

文章來源:博客園

您還未登錄,請先登錄

熱門帖子

最新帖子

?