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 内置函数complex详解
Oct 23 Python
python如何让类支持比较运算
Mar 20 Python
Python同步遍历多个列表的示例
Feb 19 Python
Django 实现前端图片压缩功能的方法
Aug 07 Python
使用Pytorch来拟合函数方式
Jan 14 Python
tensorflow 环境变量设置方式
Feb 06 Python
python 等差数列末项计算方式
May 03 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
python温度转换华氏温度实现代码
Dec 06 Python
Python使用BeautifulSoup4修改网页内容
May 20 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+Html+缓存
2006/12/20 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
php正则修正符用法实例详解
2016/12/29 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
使用javascript做的一个随机点名程序
2014/02/13 Javascript
JQuery基础语法小结
2015/02/27 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
2017/04/21 Javascript
写一个移动端惯性滑动&amp;回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
微信小程序数据分析之自定义分析的实现
2018/08/17 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
Python中 CSV格式清洗与转换的实例代码
2019/08/29 Python
Python绘制热力图示例
2019/09/27 Python
解决pycharm 格式报错tabs和space不一致问题
2021/02/26 Python
美国手机支架公司:PopSockets
2019/11/27 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
土木工程师岗位职责
2013/11/24 职场文书
道路交通安全实施方案
2014/03/12 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书