Python字符串处理实例详解
Python字符串处理实例详解
一、拆分含有多种分隔符的字符串
1.如何拆分含有多种分隔符的字符串
问题: 我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如:
s = "ab;cd|efg|hi,jkl|mntopq;rst,uvwtxyz"
其中;,|,t 都是分隔符号,如何处理?
方法一: 连续使用str.split()方法,每次处理一种分隔符号
s = "ab;cd|efg|hi,jkl|mntopq;rst,uvwtxyz" 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|mntopq;rst,uvwtxyz" 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 worldrn'
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 = 'tabct123txyz' # 去除t In [9]: s.replace('t','') Out[9]: 'abc123xyz' In [10]: s = 'tabct123txyzropqr' In [11]: import re # 去除tr In [12]: re.sub('[tr]','',s) Out[12]: 'abc123xyzopq' In [13]: s = 'abcrefgn2342t' # 去除trn In [14]: s.translate(None,'trn') Out[14]: 'abcefgx9c2' In [15]: u = u'zǒu' In [16]: u Out[16]: u'zu01d2u' In [17]: print u.translate({0x01d2:None}) zu
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
Python 迭代器与生成器实例详解
Python迭代器与生成器实例详解一、如何实现可迭代对象和迭代器对象1.由可迭代对象得到迭代器对象例如l就是可迭代对象,iter(l)是迭代器对象In[1]:l=[1,2,
Python操作MongoDB详解及实例
Python操作MongoDB详解及实例由于需要在页面展示MongoDB库里的数据,所以考虑使用python操作MongoDB,PyMongo模块是Python对MongoDB操作的接口包,所以首页安装pym
Python实现的文本简单可逆加密算法示例
本文实例讲述了Python实现的文本简单可逆加密算法。分享给大家供大家参考,具体如下:其实很简单,就是把一段文本每个字符都通过某种方式改变(
编辑:一起学习网
标签:字符串,方法,迭代,文件,字符