home1.gif

一. str 基本特性

  • 多个字符组成的有序的序列,是字符的集合
  • 引号包围(单引号、双引号、三引号)
  • 字符串是不可变对象
  • 字符串是 Unicode 类型(Py3版本)


1. str 初始化(定义)


【实例 1】定义字符串的几种方法

  1. s1 = 'string1' # 单引号定义
  2. s2 = "string2" # 双引号定义
  3. sql = """select * from user where name='tom'""" # 三引号定义
  4. s4 = str() # 内置函数定义

2. str 元素访问


访问 str 元素用索引(即下标)访问。

  • str 使用索引访问
  • str 是有序的字符序列,可迭代遍历访问元素

【实例 2】str 元素访问的方法

  1. s1 = 'abcde'
  2. s1[2] == 'c' # 可访问,但不可修改,即 s1[2] = 'c'
  3. for c in s1:
  4. print(c)

3. str 编码问题


我们都知道计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特位(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(2),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A 的编码是 65,小写字母 z 的编码是 122。

如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和 ASCII 编码冲突,所以,中国制定了 GB2312 编码,用来把中文编进去。

类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode 应运而生。Unicode 把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

Unicode 通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为 0 就可以。

Python 在后来的版本中添加了对 Unicode 的支持,以 Unicode 表示的字符串用u’…’表示。不过在最新的 Python 3 版本中,字符串是以 Unicode 编码的,也就是说,Python 的字符串支持多语言。就像你偶尔看到的代码中没有加u’…’,也能正常显示。

不过由于 Python 源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为 UTF-8 编码。当Python 解释器读取源代码时,为了让它按 UTF-8 编码读取,我们通常在文件开头写上这两行:

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-

第一行注释是为了告诉 Linux/OS X 系统,这是一个 Python 可执行程序,Windows 系统会忽略这个注释;
第二行注释是为了告诉 Python 解释器,按照 UTF-8 编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

注意

申明了 UTF-8 编码并不意味着你的 .py 文件就是 UTF-8 编码的,必须并且要确保文本编辑器正在使用 UTF-8 without BOM 编码

goon.gif

一. str 常见的处理方法


字符串处理的常用方法,如连接字符串,分割字符串等等。

1. str 连接 *


  • join 连接 *
    1. 'string'.join(iterable) -> str
    说明:
  1. 功能:使用 string 作为连接符(或理解成分隔符),将可迭代对象 iterable 的每个元素连接起来
  2. 返回值:返回一个新字符串
  3. 注意:iterable 对象本身的元素都是字符串

【实例 3】使用 join() 方法连接字符串

  1. s1 = 'abc'
  2. '-'.join(s1) == 'a-b-c'
  3. ip_box = ['192', '168', '100', '111']
  4. a_ip = '.'.join(ip_box) # a_ip == '192.168.100.111'
  • + 连接
    1. str_1 + str_2 -> str
    说明:
  1. 功能:将两个字符串连接在一起
  2. 返回值:返回一个新字符串

2. str 分割 *


分割字符串有 2 个系列:split系、partition系。

  • split() 分割 *
    1. string.split(sep=None, maxsplit=-1) -> list[str]
    说明:
  1. 功能:将字符串string按照分隔符sep分割成若干字符串(从左至右分割)
  2. 返回值:返回一个字符串的列表list
  3. 其他:sep 为分隔符,默认下空白字符串为分隔符; maxsplit指定分割次数,默认值 -1 表示遍历整个字符串

【实例 4】使用 split() 将接收到的字段名字符串拆分开

  1. std_input = 'id name comments'
  2. data_field = std_input.split()

split 家族还有其他几个类似方法:

  1. # 从右向左分割
  2. string.rsplit(sep=None, maxsplit=-1) -> list[str]
  3. # 按照行来切分字符串
  4. string.splitlines([keepends]) -> list[str]

说明:

  1. keepends 指的是是否保留行分隔符(\n、\r\n、\r),默认不保留,如需保留可设置为 True。
  • partition() 分割 *
    1. string.partition(sep) -> tuple(str) # tuple(str): (head, sep, tail)
    说明:
  1. 功能:将字符串按照分隔符分割成2段(从左至右),
  2. 返回值:返回一个三元组(如果没有找到分隔符,就返回头,2个空元素的三元组(string, ‘’, ‘’)
  3. 其他:sep 分隔符必须指定,注意,空分隔符不等于空格分隔符(’’ != ‘ ‘)

【实例 5】从网址字符串中分离出协议和域名

  1. url = "https://www.baidu.cn"
  2. protocol, _, domain = url.partition('://')
  3. print(protocol,domain, sep='\n')

partition 家族还有一个分割方法

  1. string.rpartition(sep) -> tuple(str)

说明:

  1. 功能:从右至左分割
  2. 返回值:返回三元组;如没有找到分隔符,就返回2个空元素,和尾的三元组 (‘’, ‘’, string)

3. str “修改”


  • 字符串替换 - replace()
    1. string.replace(old, new[, count]) -> str
    说明:
  1. 功能:字符串中找到匹配的子串,并替换为新子串
  2. 返回值:返回新字符串
  3. 其他:count表示替换次数,不指定就全部替换
  • 字符串“修改”- strip() *
    1. string.strip([chars]) -> str
    说明:
  1. 从字符串两端去除指定的字符集chars中的所有字符,如果没有指定chars,就去除两端的空白字符
  2. 返回值:返回一个字符串 ```python

    从左开始去除

    string.lstrip([chars]) -> str

从右开始去除

string.rstrip([chars]) -> str

  1. <a name="AEERr"></a>
  2. #### 4. str 大小写
  3. ---
  4. 关于字符串大小写处理的常用方法,如下:
  5. | **方法** | **返回值** | **描述** |
  6. | :---: | :---: | :---: |
  7. | string.upper() | str | 将字符串全部大写 |
  8. | string.lower() | str | 将字符串全部小写 |
  9. | string.swapcase() | str | 互换字符串里的大小写,大写->小写,小写->大写 |
  10. <a name="Z1ANm"></a>
  11. #### 5. str 排版
  12. ---
  13. | **方法** | **返回值** | **描述** |
  14. | :---: | :---: | :---: |
  15. | string.title() | str | 将每个单词的首字母都大写 |
  16. | string.capitalize() | str | 将整个字符串的首个单词的首个字母大写 |
  17. | string.center(width[, fillchar]) | str | 居中打印/显示。width为打印宽度,fillchar为填充的字符 |
  18. | string.ljust(width[, fillchar]) | str | 左对齐 |
  19. | string.rjust(width[, fillchar]) | str | 右对齐 |
  20. | string.zfill(width) | str | 右对齐,左边用0填充。width为打印宽度 |
  21. <a name="20so0"></a>
  22. #### 6. str 查找 *
  23. ---
  24. - **查找 str 索引 - find() ***
  25. ```python
  26. string.find(sub_str[, start[, end]]) -> int

从左至右,在指定区间内查找子串,返回索引值,若没有返回 -1。

  • 查找 str 索引 - rfind()

    1. string.rfind(sub_str[, start[, end]]) -> int

    与 find() 类似,从右至左查找,返回索引值,没有返回 -1。

  • 查找 str 索引 - index() *

    1. string.index(sub_str[, start[, end]]) -> int

    与 find() 一样,从左至右查找子串,返回索引,没有抛出异常。

  • 查找 str 索引 - rindex()

    1. string.rfind(sub_str[, start[, end]]) -> int

    与 rfind() 类似,从右至左查找,返回索引值,没有返回 -1。

  • 查找并统计 str 次数 - count() *

    1. string.count(sub_str[, start[, end]]) -> int

    在指定区间内,从左至右,统计子串 sub_strn 出现的次数。

index 和 count 方法都是O(n),随着列表数据规模的增大,效率也会加大。

  • len(string)

返回字符串的长度。


7. str 判断


  • 判断 str 开头 - startswith()

    1. string.startswith(prefix_str[, start[, end]]) -> bool

    判断在指定区间内[start, end),字符串string是否是以 prefix_str开头。

  • 判断 str 结尾 - endswith()

    1. string.endswith(suffix_str[, start[, end]]) -> bool

    判断在指定区间内[start, end),字符串string是否是以 suffix_str结尾。

  • 判断 str - is系列 | 方法 | 描述 | | —- | —- | | isalnum() | 判断string是否是字母和数字的组合 | | isalpha() | 是否是字母 | | isdigit() | 是否全部是数字(0 - 9) | | isdecimal() | 是否只包含十进制数字 | | isidentifier() ** | 是否是字母和下划线开头,其他都是字母、数字、下划线。常用于密码格式 | | islower() | 是否都小写 | | isupper() | 是否都大写 | | isspace() | 是否都是空白字符 |

用法都形同:string.isalnum() -> bool,均返回bool值。

8. str 格式化


字符串的格式化,是一种拼接字符串输出样式的手段,大概想到这几种:

  • join 拼接,但join拼接只能使用分隔符,且要求被拼接的是可迭代对象;
    • 拼接,遇到非字符串时需先转换为string后在拼接;
  • %占位符拼接,细说;
  • format函数,细说;

  • % 占位符格式化 ```python

    基本格式

    ‘format_str’ % value

就像这样

pi = 3.1415926 ‘%03d, %s, %.2f’ % (pi, pi, pi)

  1. 说明:
  2. 1. 占位符:%+格式字符,如 %s、%d
  3. 1. 占位符中间可以插入修饰字符,如%03d,表示整型数字占3个位置,不够时前面补 0
  4. 1. 格式字符串和被格式的值之间固定用 % 分割;
  5. 1. value 是一个对象,如或是一个字符串,或一个元组,或一个字典
  6. - **format() 格式化 ********
  7. ```python
  8. '{} {n} {xxx}'.format(*args, **kwargs) -> str

说明:

  1. args 是位置参数,是一个元组/列表;kwargs 是关键字参数,是一个字典;
  2. 花括号 { } 表示占位符;
  3. 空花括号 {} 是按照顺序匹配位置参数,带索引的 {n} 则取参数中对应索引的值,{xxx} 取关键字中key的值;
  4. 如打印花括号,则 {{}}

【实例 6】几种常见的格式化访问

  1. # 位置参数
  2. '{}:{}'.format('192.168.10.123', 8888)
  3. # 关键字或命名参数
  4. '{protocol}://{1}:{0}'.format(8888, '192.168.10.123', protocol='https')
  5. # 索引访问元素
  6. '{0[0]}:{0[1]}'.format(['192.168.10.123', 8888])
  7. # 对象属性访问
  8. from collections import namedtuple
  9. Point = namedtuple('Point','x y')
  10. p = Point(4,5)
  11. "{{{0.x},{0.y}}}".format(p)

使用 format 函数格式化字符串的对齐方式,尤其是数字方面:

数字 格式 输出 描述
13 {:>10d} 13 右对齐 (默认, 宽度为10)
13 {:<10d} 13 左对齐 (宽度为10)
13 {:^10d} 13 居中 (宽度为10)
5 {:0>2d} 05 数字补零 (填充左边, 宽度为2)
10 {:x<4d} 10xx 数字补x (填充右边, 宽度为4)
2.71828 {:.0f} 3 不带小数
3.1415926 {:.2f} 3.14 保留小数点后两位
0.25 {:.2%} 25.00% 百分比格式
1000000 {:,} 1,000,000 以逗号分隔的数字格式

11
‘{:b}’.format(11) 1011 二进制
‘{:d}’.format(11) 11 十进制
‘{:o}’.format(11) 13 八进制

‘{:x}’.format(11) ‘{:#x}’.format(11) ‘{:#X}’.format(11) | b
0xb
0XB | 十六进制 |

说明

  1. 冒号:前面表示索引值或引用之类;
  2. 冒号: 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充;
  3. ^, <, > 分别是居中、左对齐、右对齐,后面带宽度;
  4. b、d、o、x :分别是二进制、十进制、八进制、十六进制;
  5. 此外可以使用大括号 { } 来转义大括号,如下 ```python “{1} 对应的索引位置是 {{1}}”.format(“hello”, “world”) # ‘world 对应的索引位置是 {1}’

“{1} 对应的索引位置是 {{{1}}}”.format(“hello”, “world”) # ‘world 对应的索引位置是 {world}’ ``` 注意大括号的使用。

end1.gif