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之集成开发环境(IDE)
Sep 12 Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
Selenium控制浏览器常见操作示例
Aug 13 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
Python中的几种矩阵乘法(小结)
Jul 10 Python
python 字典 setdefault()和get()方法比较详解
Aug 07 Python
python实现翻译word表格小程序
Feb 27 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
Jan 13 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 session会话的安全性分析
2011/09/08 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
CodeIgniter框架中_remap()使用方法2例
2014/03/10 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
jQuery技巧总结
2011/01/01 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
Vue.js watch监视属性知识点总结
2019/11/11 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
python通过shutil实现快速文件复制的方法
2015/03/14 Python
Python中字典的基本知识初步介绍
2015/05/21 Python
python:socket传输大文件示例
2017/01/18 Python
python实现图片批量压缩程序
2018/07/23 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
django框架防止XSS注入的方法分析
2019/06/21 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
django框架两个使用模板实例
2019/12/11 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
tensorflow指定CPU与GPU运算的方法实现
2020/04/21 Python
公务员的自我鉴定
2013/10/26 职场文书
采购员的工作职责
2013/12/26 职场文书
保安的辞职报告怎么写
2014/01/20 职场文书
机关领导干部作风整顿整改措施
2014/09/19 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
2019入党申请书格式
2019/06/25 职场文书
MySQL插入数据与查询数据
2022/03/25 MySQL
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技