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 相关文章推荐
python实现的阳历转阴历(农历)算法
Apr 25 Python
python安装以及IDE的配置教程
Apr 29 Python
python实现简单socket通信的方法
Apr 19 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
NetworkX之Prim算法(实例讲解)
Dec 22 Python
Python Json模块中dumps、loads、dump、load函数介绍
May 15 Python
python实现图片彩色转化为素描
Jan 15 Python
pytorch之添加BN的实现
Jan 06 Python
如何使用selenium和requests组合实现登录页面
Feb 03 Python
Python实现删除某列中含有空值的行的示例代码
Jul 20 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
Feb 06 Python
Python实现简单得递归下降Parser
May 02 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
PHP基础知识介绍
2013/09/17 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
php微信开发自定义菜单
2016/08/27 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
2017/07/23 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
JS+DIV实现拖动效果
2020/02/11 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
[40:10]2015国际邀请赛全明星表演赛
2015/08/07 DOTA
[07:48]DOTA2上海特级锦标赛主赛事首日RECAP
2016/03/04 DOTA
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python入门篇之数字
2014/10/20 Python
Flask数据库迁移简单介绍
2017/10/24 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
简单的python协同过滤程序实例代码
2018/01/31 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
python逆序打印各位数字的方法
2018/06/25 Python
Python sys模块常用方法解析
2020/02/20 Python
C#和SQL Server的面试题
2016/08/12 面试题
电厂厂长岗位职责
2014/01/02 职场文书
信用卡工作证明模板
2014/09/14 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
先进典型发言材料
2014/12/30 职场文书
2014年个人总结范文
2015/03/09 职场文书
起诉书格式范文
2015/05/20 职场文书
2015年街道办事处工作总结
2015/05/22 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
详细聊聊vue中组件的props属性
2021/11/02 Vue.js
阿里云ECS云服务器快照的概念以及如何使用
2022/04/21 Servers