这里有新鲜出炉的 Python3 Cookbook 中文版,程序狗速度看过来!
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
这篇文章主要介绍了 Python 字符串处理实例详解的相关资料, 需要的朋友可以参考下
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
来源: http://www.phperz.com/article/17/0622/335403.html