Python字符串深入探讨

Python中的字符串是不可变类型,就是说改变一个字符串的元素需要新建一个新的字符串。

字符串是由独立的字符组成的,也是一种序列,上节中讲到的序列的通用操作方法也适用于字符串。例如:

  • 通过切片操作顺序地访问子串;
  • 通过len()求字符串的长度等;
  • 通过in或not in操作符判断字符串中是否存在某个字符。

Python里面没有字符这个类型,而是用长度为1 的字符串来表示这个概念,当然,这其实也是一个子串。

访问字符串举例:

aString = 'Hello World!'
print(aString[0])
print(aString[1:5])
print(aString[6:])

输出:

H

ello

World!

如何改变字符串

你可以通过给一个变量赋值(或者重赋值)的方式“更新”一个已有的字符串。新的值可能与原有值差不多,也可能跟原有串完全不同。例如:

aString = 'Hello World!'
aString = aString[:6] + 'Python!'
print(aString)
aString = 'different string altogether'
print(aString)

输出:

Hello Python!

different string altogether

如何删除字符和字符串

再重复一遍,字符串是不可变的,所以不能仅仅删除一个字符串里的某个字符,你能做的是清空一个空字符串,或者是把剔除了不需要的部分后的字符串组合起来形成一个新串。

假设您想要从“Hello World!”里面删除小写的“l”,那么您需要这样做:

aString = 'Hello World!'
aString = aString[:3] + aString[4:]
print(aString)

输出:

Helo World!

通过赋一个空字符串或者使用del 语句来清空或者删除一个字符串。不过,在大部分应用程序里,没有必要显式的删除字符串。定义这个字符串的代码最终会结束,那时Python 会自动释放这些字符串。

特殊字符和控制字符

像其他高级语言和脚本语言一样,一个反斜线加一个单一字符可以表示一个特殊字符,通常是一个不可打印的字符,这就是我们上面讨论的特殊字符,如果这些特殊字符是包含在一个原始字符串中的,那么它就失去了转义的功能。

除了通常用的特殊字符,比如换行符( )、tab 符( )之外,也可以直接用ASCII 码值来标示特殊字符:\000 或者xXX,分别对应字符的八进制和十六进制ASCII 码值,下面分别是十进制,八进制和十六进制的0、65、和255:

ASCII ASCII ASCII
十进制 0 65 255
八进制 \000 101 177
十六进制 x00 x41 xFF

特殊字符,包括反斜杠转义的那些都可以像普通字符一样存储到Python 的字符串中。

跟C 字符串的另一个不同之处是Python 的字符串并不是以NUL(\000)作为结束符的,NUL 跟其他的反斜杠转义字符没什么两样。事实上,一个字符串中不仅可以出现NUL 字符,而且还可以出现不止一次,在字符串的任意位置都可以。下表列出了被大部分Python 版本支持的转义字符。

如上所述,就像使用连字符来让一行的内容持续到下一行一样,可以用显式定义八进制或者十六进制的ASCII 码的方式定义特殊字符,合法的ASCII 码值范围是从0 到255(八进制的是0177,十六进制是0XFF)。

反斜杠开头的转义字符

X 八进制 十进制 十六进制 字符 说明
\0 000 0 0x00 Nul 空字符Nul
a 007 7 0x07 BEL 响铃字符
 010 8 0x08 BS 退格
011 9 0x09 HT 横向制表符
012 10 0x0A LF 换行
v 013 11 0x0B VT 纵向制表符
f 014 12 0x0D FF 换页
015 13 0x0D CR 回车
e 033 27 0x1B ESC 转义
042 34 0x22 双引号
047 39 0x27 单引号
\ 134 92 0x5C 反斜杠

说明:

  • OOO:八进制值(范围是000 到0177);
  • xXX:x 打头的十六进制值(范围是0x00 到0xFF);
  • :连字符,将本行和下一行的内容连接起来。

控制字符的一个作用是用做字符串里面的定界符,在数据库或者web 应用中,大多数的可打印字符都是被允许用在数据项里面的,就是说可打印的字符不适合做定界符。

用可打印的字符串比如冒号(:)来作定界符,将会很难分辨一个字符到底是数据还是定界符,而且还会限定你能用在数据项里面的字符数量,而这不是你想要的。

一个通常的解决方案是,使用那些不经常使用的,不可打印的ASCII 码值来作为定界符,它们是非常完美的定界符,这样一来诸如冒号这样的可打印字符就可以解脱出来用在数据项中了。

点赞