Python 字符串的处理技巧

split()与rsplit()

  • split()
    通过指定分隔符对字符串进行切片(前—>后),如果参数 num 有指定值,则仅分隔 num 个子字符串

    • 语法:split(str="", num=int())
    • 案例:
      str = "aaa.bbb.cc.dd"
      print str.split('.');
      print str.split('.', 1 );

      输出
      'aaa','bbb','ccc','ddd'
      'aaa','bbb.ccc.ddd'

  • rsplit()
    通过指定分隔符对字符串进行切片(后—>前),如果参数 num 有指定值,则仅分隔 num 个子字符串

    • 语法:rsplit(str="", num=int())
    • 案例:
      str = "aaa.bbb.cc.dd"
      print str.rsplit('.');
      print str.rsplit('.', 1 );

      输出
      'aaa','bbb','ccc','ddd'
      'aaa.bbb.ccc','ddd'

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

案例:
我们要把某个字符串依据分隔符号拆分不同的字符段,该字符串包含多种不同的分隔符,

例如
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|sd'
result = mySplit(s, ';,|\t')
print(result)

['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开头或结尾

在Python中有两个函数分别是startswith()函数与endswith()函数,功能都十分相似,startswith()函数判断文本是否以某个字符开始,endswith()函数判断文本是否以某个字符结束。

startswith()函数

判断一个文本是否以某个或几个字符开始,返回True或者False

text='Welcome to Xiaojing Block'
print text.startswith('W')      # True
print text.startswith('Wel')    # True
print text.startswith('w')      # False
print text.startswith('c')      # False
print text.startswith('')       # True

endswith()函数

判断一个文本是否以某个或几个字符结束,返回True或者False

text='Welcome to Xiaojing Block'
print text.endswith('k')        # True
print text.endswith('ko')       # False
print text.endswith('ck')       # True
print text.endswith('')         # True
print text.endswith('k ')       # False

案例

  • 判断文件是否为exe执行文件
    
    # coding=utf8

fileName1='qttc.exe'
if(fileName1.endswith('.exe')):
print '这是一个exe执行文件'
else:
print '这不是一个exe执行文件'

执行结果:这是一个exe执行文件

- 判断文件名后缀是否为图片
```py
# coding=utf8

fileName1='pic.jpg'
if fileName1.endswith('.jpg') or fileName1.endswith('.png'):
    print '这是一张图片'
else:
    print '这不是一张图片'

# 执行结果:这是一张图片
  • 判断一个字符串不空且不以#开头
    str='safsdaf'
    if str:
    if not str.startswith('#'):
        print(str)

扩展

  • 语法
    • startswith()方法语法:
      str.startswith(suffix[, start[, end]])
    • endswith()方法语法:
      str.endswith(suffix[, start[, end]])
  • 参数
    suffix – 该参数可以是一个字符串或者是一个元素。
    start – 字符串中的开始位置。
    end – 字符中结束位置。
  • 返回值
    如果字符串含有指定的后缀返回True,否则返回False。
  • 实例
    以下实例展示了endswith()方法的实例:

    str = "this is string example....wow!!!"
    
    suffix = "wow!!!"
    print str.endswith(suffix)              #True
    print str.endswith(suffix,20)           #True
    
    suffix = "is"
    print str.endswith(suffix, 2, 4)        #True
    print str.endswith(suffix, 2, 6)        #False

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

案例

某软件的日志文件,其中日期格式为 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\d{4})-(?P\d{2})-(?P\d{2})', r'\g/\g/\g' , 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' }
    在程序中,我们想以以下格式将其内容输出,如何处理?

    blog  : www.anshengme.com
    ip    : 127.0.0.1
    port  : 80
    title : Helloworld
  • 解决方案

    • 使用字符串的 str.ljust()  ,  str.rjust,str.cente() 进行左右居中对齐
      info={'ip':'127.0.0.1','blog':'www.anshengme.com','title':'Helloworld','port':'80'}
      #获取字典中的keys大长度
      w =  max(map(len, info.keys())) 
      for k in info:
          print k.ljust(w), ':',info[k]
    • 使用 format() 方法,传递类似'<20','>20','^20'参数完成同样任务

      info={'ip':'127.0.0.1','blog':'www.anshengme.com','title':'Helloworld','port':'80'}
      #获取字典中的keys大长度
      w =  max(map(len, info.keys())) 
      for k in info:
          print format(k,'^'+str(w)), ':',info[k]

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

实际案例

  • 过滤掉用户输入卡后多余的空白字符: anshengm.com@gmail.com
  • 过滤某windows下编辑文本中的'\r': hello word\r\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:]
  • 字符串的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 = '\rasd\t23\bAds'
    s.translate(None, '\r\t\b')
    #'asd23Ads'
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇