Python字符串处理实例详解


Posted in Python onMay 18, 2017

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 res

print mySplit(s,';|,\t')

输出:
['ab', 'cd', 'efg', 'hi', 'jkl', 'mn', 'opq', 'rst', 'uvw', 'xyz']

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

import re

s = "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_mode
Out[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]: ll
total 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.2
2017-05-08 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.2
2017-05-08 09:12:48 startup packages configure
09:12:48 startup packages configure

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

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

In [1]: import re

In [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.2
05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.2
05/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.2
05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status unpacked passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status half-configured passwd:amd64 1:4.2-3.1ubuntu5.2
05/08/2017 09:12:48 status installed passwd:amd64 1:4.2-3.1ubuntu5.2
05/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]: s
Out[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.0
smartCull : 0.04
farclip : 477

2.去掉不需要的字符串

问题:

        1.过滤掉用户输入中前后多余的空白字符: ' nick@gmail.com '

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'
# 去除\t
In [9]: s.replace('\t','')
Out[9]: 'abc123xyz'

In [10]: s = '\tabc\t123\txyz\ropq\r'

In [11]: import re
# 去除\t\r
In [12]: re.sub('[\t\r]','',s)
Out[12]: 'abc123xyzopq'

In [13]: s = 'abc\refg\n\2342\t'
# 去除\t\r\n
In [14]: s.translate(None,'\t\r\n')
Out[14]: 'abcefg\x9c2'

In [15]: u = u'zǒu'

In [16]: u
Out[16]: u'z\u01d2u'

In [17]: print u.translate({0x01d2:None})
zu

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

Python 相关文章推荐
urllib2自定义opener详解
Feb 07 Python
在Python中使用sort()方法进行排序的简单教程
May 21 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
Python SQLite3数据库日期与时间常见函数用法分析
Aug 14 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
Jul 30 Python
对python中的six.moves模块的下载函数urlretrieve详解
Dec 19 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
python SVM 线性分类模型的实现
Jul 19 Python
python 读取.nii格式图像实例
Jul 01 Python
如何把python项目部署到linux服务器
Aug 26 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 Python
如何用Python徒手写线性回归
Jan 25 Python
Python进阶-函数默认参数(详解)
May 18 #Python
Python装饰器实现几类验证功能做法实例
May 18 #Python
如何用itertools解决无序排列组合的问题
May 18 #Python
详解使用python的logging模块在stdout输出的两种方法
May 17 #Python
Python中正则表达式详解
May 17 #Python
python算法演练_One Rule 算法(详解)
May 17 #Python
浅谈pyhton学习中出现的各种问题(新手必看)
May 17 #Python
You might like
计算php页面运行时间的函数介绍
2013/07/01 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
twig模板常用语句实例小结
2016/02/04 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
laravel实现按月或天或小时统计mysql数据的方法
2019/10/09 PHP
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
react高阶组件添加和删除props
2019/04/26 Javascript
js实现飞机大战游戏
2020/08/26 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
Python类的基础入门知识
2008/11/24 Python
Python中threading模块join函数用法实例分析
2015/06/04 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
英国手机零售商:Metrofone
2019/03/18 全球购物
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
小学语文教研活动总结
2014/07/01 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
2014年优秀党员材料
2014/12/18 职场文书
罚站检讨书
2015/01/29 职场文书
保护动物的宣传语
2015/07/13 职场文书
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android