侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python字符串处理实例详解

Python  /  管理员 发布于 7年前   198

Python字符串处理实例详解

一、拆分含有多种分隔符的字符串

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

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

s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz"

其中;,|,\t 都是分隔符号,如何处理?

方法一: 连续使用str.split()方法,每次处理一种分隔符号

s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz"def mySplit(s,ds): res = [s] for d in ds:  t = []  map(lambda x: t.extend(x.split(d)), res)  res = t return resprint mySplit(s,';|,\t')输出:['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']

方法二: 使用正则表达式的re.split()方法,一次性拆分字符串

import res = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz"print re.split(r'[;|,\t]+',s)输出:['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']

二、调整字符串中文本格式

1. 如何判断字符串a是否以字符串b开头或结尾

问题:某文件系统目录下有一系列文件:a.py,quicksort.c,stack.cpp,b.sh , 编写程序给其中所有.sh文件和.py文件加上用户可执行权限?

解决方案: 使用字符串中的str.startswith()和end.startswith()方法 (注意:多个匹配时参数使用元组)

In [1]: import os# 列出当前目录以.sh和以.py结尾的文件In [2]: [name for name in os.listdir('.') if name.endswith(('.py','.sh'))]Out[2]: ['b.sh', 'a.py']In [3]: import stat# 查看 a.py 文件权限In [4]: os.stat('a.py').st_modeOut[4]: 33204# 把文件权限转换成8进制,即为平常看到的权限In [5]: oct(os.stat('a.py').st_mode)Out[5]: '0100664'# 更改文件权限,添加一个可执行权限In [6]: os.chmod('a.py',os.stat('a.py').st_mode | stat.S_IXUSR)In [7]: lltotal 0-rwxrw-r-- 1 yangyang 0 5月 9 14:48 a.py*-rw-rw-r-- 1 yangyang 0 5月 9 14:48 b.sh-rw-rw-r-- 1 yangyang 0 5月 9 14:48 quicksort.c-rw-rw-r-- 1 yangyang 0 5月 9 14:48 stack.cpp

2.如何对字符串中文本的格式进行调整

问题: 某软件的log文件,其中日期格式为“yyyy-mm-dd”:

2017-05-08 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.22017-05-08 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.22017-05-08 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.22017-05-08 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.22017-05-08 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.22017-05-08 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.22017-05-08 09:12:48 startup packages configure09:12:48 startup packages configure

我们想把其中日期改为美国日期的格式"mm/dd/yyyy",2017-05-08 ==> 05/08/2017 ,应如何处理?

解决方案:使用正则表达式re.sub()方法做字符串替换,利用正则表达式的捕获组捕获每个部分内容,在字符串中调整各个组的捕获顺序。

In [1]: import reIn [2]: log = open('/var/log/dpkg.log').read()# (\d{4}) 匹配到4个数字为一个捕获组,其顺序为1。故后面替换用\1放到最后,r是为了防止字符串被转义In [3]: print re.sub('(\d{4})-(\d{2})-(\d{2})',r'\2/\3/\1', log)05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.205/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.205/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.205/08/2017 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.205/08/2017 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.205/08/2017 09:12:48 startup packages configure# 也可以为每个捕获组起个名称,而不使用默认顺序来处理In [5]: print re.sub('(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})',r'\g<month>/\g<day>/\g<year>', log)05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.205/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.205/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.205/08/2017 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.205/08/2017 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.205/08/2017 09:12:48 startup packages configure

三、字符串拼接

1.如何将多个小字符串拼接成一个大的字符串

问题:在程序中我们将各个参数按次序收集到列表中: ["<0112>", "<32>","<1024x768>","<60>" ],要把各个参数拼接成数据报进行发送"<0112><32><1024x768><60>"

解决方案:

方法一:迭代列表,连续使用“+”操作依次拼接每一个字符串

In [1]: pl = ["<0112>", "<32>","<1024x768>","<60>" ]In [2]: s = ''# 这种方法会产生许多临时结果,会造成资源的浪费In [3]: for p in pl: ...:  s = s + p ...:  print s ...:  <0112><0112><32><0112><32><1024x768><0112><32><1024x768><60>In [4]: sOut[4]: '<0112><32><1024x768><60>'

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

In [5]: ''.join(pl)Out[5]: '<0112><32><1024x768><60>'

有个列表l = ['abc',123,45,'xyz'],如何让123和45以字符串的方式拼接

In [6]: l = ['abc',123,45,'xyz']# 使用生成器表达式,开销比列表表达式小In [7]: (str(x) for x in l) ...: Out[7]: <generator object <genexpr> at 0x7fe3cadef550>In [8]: ''.join(str(x) for x in l)Out[8]: 'abc12345xyz'

四、字符串居中对齐

1.如何对字符串进行左、右、居中对齐

问题: 某个字典存储了一系列属性值

{ "loDist":100.0, "smartCull":0.04, "farclip":477}

在程序中想以工整的格式进行输出,如何处理?

解决方案:

方法一: 使用字符串的str.ljust(),str.rjust(),str.center()进行,右,居中对齐

方法二: 使用format方法,传递类似'<20','>20','^20'参数完成同样任务

In [1]: s = 'abc'In [2]: s.ljust(20)Out[2]: 'abc     'In [3]: s.ljust(20,'=')Out[3]: 'abc================='In [4]: s.center(20)Out[4]: '  abc   'In [5]: format(s,'<20')Out[5]: 'abc     'In [6]: d = { ...:  "loDist":100.0, ...:  "smartCull":0.04, ...:  "farclip":477 ...: }In [7]: d.keys()Out[7]: ['loDist', 'smartCull', 'farclip']In [8]: w =max(map(len,d.keys()))In [9]: for k in d: ...:  print k.ljust(w),':',d[k] ...:  loDist : 100.0smartCull : 0.04farclip : 477

2.去掉不需要的字符串

问题:

        1.过滤掉用户输入中前后多余的空白字符: ' [email protected] '

2.过滤某windows下编辑文本中的'\r': 'hello world\r\n'

3.去掉文本中的unicode组合符号(音调):u'zǒu'

解决方案:

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

方法二:删除单个固定位置的字符,可以使用切片+拼接的方式

方法三:字符串的replace方法或正则表达式re.sub()方法删除任意位置字符

方法四:字符串translate()方法,可以同时删除多种不同字符

In [1]: s = ' abc 123 'In [2]: s.strip()Out[2]: 'abc 123'In [3]: s.lstrip()Out[3]: 'abc 123 'In [4]: s = '-----ab+++++'In [5]: s.strip('-+')Out[5]: 'ab'In [6]: s = 'abc:123'In [7]: s[:3]+s[4:]Out[7]: 'abc123'In [8]: s = '\tabc\t123\txyz'# 去除\tIn [9]: s.replace('\t','')Out[9]: 'abc123xyz'In [10]: s = '\tabc\t123\txyz\ropq\r'In [11]: import re# 去除\t\rIn [12]: re.sub('[\t\r]','',s)Out[12]: 'abc123xyzopq'In [13]: s = 'abc\refg\n\2342\t'# 去除\t\r\nIn [14]: s.translate(None,'\t\r\n')Out[14]: 'abcefg\x9c2'In [15]: u = u'zǒu'In [16]: uOut[16]: u'z\u01d2u'In [17]: print u.translate({0x01d2:None})zu

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


  • 上一条:
    Python 迭代器与生成器实例详解
    下一条:
    Python进阶-函数默认参数(详解)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客