python 字符串处理

python cookbook 第一章

1.1 每次处理一个字符串

将字符串转换为列表

使用内建 list ,将字符串转换为列表

1
theList = list(theString)

1.7 反转字符串

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
astring='i have a dream'

# 逐个字符反转
revchars=astring[::-1]

# 按空格拆分为列表并反转
revwards=astring.split()
revwards.reverse()
revwards=' '.join(revwards) # 使用空格链接


# 逐词反转但是改变空格, 使用正则表达式
import re
revwards=re.split(r'(\s+)',astring) # 使用正则表达式拆分保留空格
revwards.reverse()
revwards=''.join(revwards)  # 使用空字符串连接

1.8 使用set检查字符出现

检查字符串中是否出现了某字符集合中的字符

1
2
3
4
5
6
7

def containsAny(seq,aset):
    if c in seq:
        if c in aset:
            return True
    return False
    

注意: 判断存在比判断不存在效率更高,因为不存在会遍历所有字符。

1
2
3
4
5
6
7
8

# 使用 itertools 模块

import itertools
def containsAny(seq,aset):
    for item in itertools.ifilter(aset.__contains__,seq):
        return True
    return False

itertools 是标准库模块,比之前的性能更好,但本质上是一样的。

1
2
3
def containsAll(seq,aset):
    '''检查序列seq是否含有aset的所有元素'''
    return not set(aset).difference(seq)

set定义: 任何一个set对象a, a.difference(b) 返回 a 中所有不属于 b 的元素。

1.12 字符串大小写

1
2
3
4
5
6
7
8
# 大写/小写/单词首字母大写/句子首字母大写
s.upper()
s.lower()
s.title()
s.capitalize()
s.isupper()
s.islower()
s.istitle()

1.13 访问子字符串

获取字符串的某个部分。

切片与 struct.unpack

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 切片
afield = theline[3:8]

# 使用 struct.unpack 获取一个或多个指定长度的子字符串
import struct

#@breif: 得到第一个5字节的字符串,跳过3字节,得到两个8字节的字符串
baseformat = "5s 3x 8s 8s"


#@breif: 得到之前剩余部分字符串
numremain=len(theline)-struct.calcsize(baseformat)
format="%s %ds" % (baseformat,numremain)

# 注意:struct.calcsize(baseformat) 计算格式化字符串的长度

# 获取截取的字符串
l,s1,s2,t=struct.unpack(format,theline)

# 如果想要跳过其余部分,需要截取theline开头部分
l,s1,s3=struct.unpack(baseformat,theline[:struct.calcsize(baseformat))

注意: l,s1,s2=struct.unpack(baseformat,theline) len(theline) 必须与 struct.calcsize(format) 相等,不然会报错。

带列表推倒(LC)的切片

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18

# 获取 5 个字节一组的数据
fivers=[theline[k:k+5] for k in xrange(0,len(theline),5)]

# 一个字节
chars=list(theline)

# 使用LC获取指定长度的切片边界
cuts=[8,14,20,26,30]
pieces=[theline[i:j] for i,j in zip([0]+cuts,cuts+[None])]
>>> for x in zip([0]+cuts,cuts+[None]):
	print x
(0, 8)
(8, 14)
(14, 20)
(20, 26)
(26, 30)
(30, None)

LC中调用zip,返回一个列表,形如([cuts[k],cuts[k+1])

1.24 让某些字符串大小写不敏感