python 字符串处理

进制转换 / 编码转换

  • hex, 十进制->十六进制字符串
  • oct, 十进制->八进制字符串
  • oct, 十进制->八进制字符串
  • chr, 十进制->ASCII码字符
  • unichr, 十进制->unicode编码
  • ord, ascii码/unicode编码->十进制
  • binascii, 字符串<->字节流
  • struct, 字符串<->字节流
    • struct中的 fmt 详解
  • str.decode / str.encode, 基于unicode的编码转换
  • Standard Encodings, python支持的编码表
    • 常用的有 hex, utf-8, unicode_escape
  • python字符串编码及乱码解决方案
    • 解释了unicode与str在python2.7 和 python3下的区别. str.decodestr.encode的含义
    • python2.7, 默认str编码为ascii, 需要使用s=u"人生苦短"来表示unicode编码字符串(便于跨平台统一)
    • 终极原则: decode early, unicode everywhere, encode late
  • 更多的python内置函数如下
    • int(x [,base ]), 将x转换为一个整数
    • long(x [,base ]), 将x转换为一个长整数
    • float(x), 将x转换到一个浮点数
    • complex(real [,imag ]), 创建一个复数
    • str(x) , 将对象 x 转换为字符串
    • repr(x), 将对象 x 转换为表达式字符串
    • eval(str), 用来计算在字符串中的有效Python表达式,并返回一个对象
    • tuple(s), 将序列 s 转换为一个元组
    • list(s), 将序列 s 转换为一个列表

十进制<->十六进制字符串

>>> hex(255)
'0xff'
>>> float.hex(1.0)
'0x1.0000000000000p+0'

# 可以有前缀 0b/0B(二进制), 0o/0O/0(八进制), or 0x/0X(十六进制),
>>> int('0xff', 16)
255
>>> int('ff', 16)
255

二进制字符串<->十六进制字符串

>>> bin(int('0xff', 16))
'0b11111111'

>>> hex(int('0b1010',2))
'0xa'

十进制<->unicode字符串<->utf8编码

>>> c = u'ñ'            # u表示使用unicode编码存储.
>>> c # 显示c在电脑中的值
u'\xf1' # 即 u'\u00f1', \u需要2byte!

>>> ord(c)
241

>>> unichr(241)
u'\xf1'

>>> u'\u00f1'.encode('utf-8') # unicode->utf-8
'\xc3\xb1'
>>> '\xc3\xb1'.decode('utf-8') # utf-8->unicode
u'\xf1'
>>> print u'\u00f1' # 打印显示
ñ

字节流<->整数

# 使用 struct
>>> import struct

# 字节流->整数
>>> struct.unpack('<hh', bytes(b'\x01\x00\x00\x00')) # 转义为short型整数
(1, 0)
>>> struct.unpack('<L', bytes(b'\x01\x00\x00\x00')) # 转义为long型整数
(1,)

# 整数->字节流
>>> struct.pack('<HH', 1,2)
'\x01\x00\x02\x00'
>>> struct.pack('<LL', 1,2)
'\x01\x00\x00\x00\x02\x00\x00\x00'

几个实用的例子

  • 去掉字符串中的跳脱符, 生成标准的unicode字符串
>>> u'\\u4f60\\u4f60'.decode('unicode_escape')
u'\u4f60\u4f60'
  • 解码16进制字符串:也可以直接 print 出来
>>> b='\xd1\xee\xba\xea\xc1\xc1\n'
>>> print unicode(b, 'gbk').encode('utf8') # 等同于 print b.decode('gbk').encode('utf8')
  • bin <-> ascii
# 字符串->ASCII编码串
>>> '1234'.encode("hex")
'31323334'
# ASCII编码串->字符串
>>> '3031'.decode("hex")
'01'

# 使用 binascii
>>> import binascii
>>> binascii.hexlify("1234") # 或者 binascii.b2a_hex("1234")
'31323334'
>>> binascii.unhexlify("3031") # 或者 binascii.a2b_hex("3031")
'01'

字符串<->数值/列表/字典

字符串<->数值

  • int(x [,base ]), 将x转换为一个整数
  • long(x [,base ]), 将x转换为一个长整数
  • float(x), 将x转换到一个浮点数
  • 使用re正则表达式, 实用范例
>>> import re
>>> str = "test: 12a345 to 325.-123.34"
>>> # this can get the number from str like "good456sdg78", return ['456', '78']
>>> print re.findall(r'\d+', str)
['12', '345', '325', '123', '34']
>>> # this can get the number seperate in str like "good12sd 45 78 ", return ['45', '78']
>>> print re.findall(r'\b\d+\b', str)
['325', '123', '34']
>>> # more complicated, can recognize and return [30, -10, 34.12, -12.34, 67.56E+3, -14.23e-2]
>>> print re.findall("[-+]?\d+[\.]?\d+[eE]?[-+]?\d*", str)
['12', '345', '325', '-123.34']

字符串->列表/字典 (去掉引号)

# 字符串->列表
>>> eval("[1,2,3]")
[1, 2, 3]

# 字符串->字典
>>> eval("{'one':1, 'two':2}")
{'two': 2, 'one': 1}

字符串<->列表

  • str.join(), 列表->字符串
  • str.split(), 字符串->列表
# 字符串->列表
>>> lst = list("hello")
>>> lst
['h', 'e', 'l', 'l', 'o']

# 列表->字符串
>>> ''.join(lst)
'hello'

# 字符串->列表 (指定分隔符, 如空格, 逗号)
>>> season = 'spring, summer, autumn, winter'
>>> season.split (',')
['spring', ' summer', ' autumn', ' winter']

# 列表->字符串
>>> lst = ["spring", "summer", "autumn", "winter"]
>>> ', '.join(lst)
'spring, summer, autumn, winter'

# 整数列表->字符串
>>> lst = [1, 2, 3]
>>> ''.join(str(e) for e in lst)
'123'

# 字符串->hex格式列表->hex格式字符串
>>> map(ord, "1234") # [0x31, 0x32, 0x33 0x34]
[49, 50, 51, 52]
>>> ''.join(["%02x" % i for i in map(ord, "1234")])
'31323334'

字符串操作

操作基础

# 去前后空格及特殊符号
s.strip().lstrip().rstrip(',')

# 查找字符
sStr1.index(sStr2) # 返回所在位置, 不存在则报错
sStr2 in sStr1 # 返回 True or False

# 比较字符串
cmp(sStr1,sStr)

# 字符串长度
len(sStr1)

# 将字符串中的大小写转换
sStr1.upper().lower()

# 扩充到指定长度
str(01).zfill(5) # “00001”

# 翻转字符串
sStr1[::-1]

# 分割字符串
s.split(',')

# 字符串切片
str = ’0123456789′
print str[0:3] # 截取第一位到第三位的字符
print str[:] # 截取字符串的全部字符
print str[6:] # 截取第七个字符到结尾
print str[:-3] # 截取从头开始到倒数第三个字符之前
print str[2] # 截取第三个字符
print str[-1] # 截取倒数第一个字符
print str[::-1] # 创造一个与原字符串顺序相反的字符串
print str[-3:-1] # 截取倒数第三位与倒数第一位之前的字符
print str[-3:] # 截取倒数第三位到结尾

查看手册及高阶使用

使用正则表达式的一些例子

# 去掉所有的空格和tab
re.sub('[\s+]', '', str)

# 转换小写下划线格式变化为驼峰格式
re.sub('^\w|_\w', lambda x:x.group()[-1].upper(), 'blog_view') # 输出 'BlogView'。

原创于 DRA&PHO