一. str 基本特性
- 多个字符组成的有序的序列,是字符的集合
- 引号包围(单引号、双引号、三引号)
- 字符串是不可变对象
- 字符串是 Unicode 类型(Py3版本)
1. str 初始化(定义)
【实例 1】定义字符串的几种方法
s1 = 'string1' # 单引号定义
s2 = "string2" # 双引号定义
sql = """select * from user where name='tom'""" # 三引号定义
s4 = str() # 内置函数定义
2. str 元素访问
访问 str 元素用索引(即下标)访问。
- str 使用索引访问
- str 是有序的字符序列,可迭代遍历访问元素
【实例 2】str 元素访问的方法
s1 = 'abcde'
s1[2] == 'c' # 可访问,但不可修改,即 s1[2] = 'c'
for c in s1:
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 编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉 Linux/OS X 系统,这是一个 Python 可执行程序,Windows 系统会忽略这个注释;
第二行注释是为了告诉 Python 解释器,按照 UTF-8 编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。
注意
申明了 UTF-8 编码并不意味着你的 .py 文件就是 UTF-8 编码的,必须并且要确保文本编辑器正在使用 UTF-8 without BOM 编码
一. str 常见的处理方法
字符串处理的常用方法,如连接字符串,分割字符串等等。
1. str 连接 *
- join 连接 *
说明:'string'.join(iterable) -> str
- 功能:使用 string 作为连接符(或理解成分隔符),将可迭代对象 iterable 的每个元素连接起来
- 返回值:返回一个新字符串
- 注意:iterable 对象本身的元素都是字符串
【实例 3】使用 join() 方法连接字符串
s1 = 'abc'
'-'.join(s1) == 'a-b-c'
ip_box = ['192', '168', '100', '111']
a_ip = '.'.join(ip_box) # a_ip == '192.168.100.111'
- + 连接
说明:str_1 + str_2 -> str
- 功能:将两个字符串连接在一起
- 返回值:返回一个新字符串
2. str 分割 *
分割字符串有 2 个系列:split系、partition系。
- split() 分割 *
说明:string.split(sep=None, maxsplit=-1) -> list[str]
- 功能:将字符串string按照分隔符sep分割成若干字符串(从左至右分割)
- 返回值:返回一个字符串的列表list
- 其他:sep 为分隔符,默认下空白字符串为分隔符; maxsplit指定分割次数,默认值 -1 表示遍历整个字符串
【实例 4】使用 split() 将接收到的字段名字符串拆分开
std_input = 'id name comments'
data_field = std_input.split()
split 家族还有其他几个类似方法:
# 从右向左分割
string.rsplit(sep=None, maxsplit=-1) -> list[str]
# 按照行来切分字符串
string.splitlines([keepends]) -> list[str]
说明:
- keepends 指的是是否保留行分隔符(\n、\r\n、\r),默认不保留,如需保留可设置为 True。
- partition() 分割 *
说明:string.partition(sep) -> tuple(str) # tuple(str): (head, sep, tail)
- 功能:将字符串按照分隔符分割成2段(从左至右),
- 返回值:返回一个三元组(如果没有找到分隔符,就返回头,2个空元素的三元组(string, ‘’, ‘’)
- 其他:sep 分隔符必须指定,注意,空分隔符不等于空格分隔符(’’ != ‘ ‘)
【实例 5】从网址字符串中分离出协议和域名
url = "https://www.baidu.cn"
protocol, _, domain = url.partition('://')
print(protocol,domain, sep='\n')
partition 家族还有一个分割方法:
string.rpartition(sep) -> tuple(str)
说明:
- 功能:从右至左分割
- 返回值:返回三元组;如没有找到分隔符,就返回2个空元素,和尾的三元组 (‘’, ‘’, string)
3. str “修改”
- 字符串替换 - replace()
说明:string.replace(old, new[, count]) -> str
- 功能:字符串中找到匹配的子串,并替换为新子串
- 返回值:返回新字符串
- 其他:count表示替换次数,不指定就全部替换
- 字符串“修改”- strip() *
说明:string.strip([chars]) -> str
- 从字符串两端去除指定的字符集chars中的所有字符,如果没有指定chars,就去除两端的空白字符
- 返回值:返回一个字符串
```python
从左开始去除
string.lstrip([chars]) -> str
从右开始去除
string.rstrip([chars]) -> str
<a name="AEERr"></a>
#### 4. str 大小写
---
关于字符串大小写处理的常用方法,如下:
| **方法** | **返回值** | **描述** |
| :---: | :---: | :---: |
| string.upper() | str | 将字符串全部大写 |
| string.lower() | str | 将字符串全部小写 |
| string.swapcase() | str | 互换字符串里的大小写,大写->小写,小写->大写 |
<a name="Z1ANm"></a>
#### 5. str 排版
---
| **方法** | **返回值** | **描述** |
| :---: | :---: | :---: |
| string.title() | str | 将每个单词的首字母都大写 |
| string.capitalize() | str | 将整个字符串的首个单词的首个字母大写 |
| string.center(width[, fillchar]) | str | 居中打印/显示。width为打印宽度,fillchar为填充的字符 |
| string.ljust(width[, fillchar]) | str | 左对齐 |
| string.rjust(width[, fillchar]) | str | 右对齐 |
| string.zfill(width) | str | 右对齐,左边用0填充。width为打印宽度 |
<a name="20so0"></a>
#### 6. str 查找 *
---
- **查找 str 索引 - find() ***
```python
string.find(sub_str[, start[, end]]) -> int
从左至右,在指定区间内查找子串,返回索引值,若没有返回 -1。
查找 str 索引 - rfind()
string.rfind(sub_str[, start[, end]]) -> int
与 find() 类似,从右至左查找,返回索引值,没有返回 -1。
查找 str 索引 - index() *
string.index(sub_str[, start[, end]]) -> int
与 find() 一样,从左至右查找子串,返回索引,没有抛出异常。
查找 str 索引 - rindex()
string.rfind(sub_str[, start[, end]]) -> int
与 rfind() 类似,从右至左查找,返回索引值,没有返回 -1。
查找并统计 str 次数 - count() *
string.count(sub_str[, start[, end]]) -> int
在指定区间内,从左至右,统计子串 sub_strn 出现的次数。
index 和 count 方法都是O(n),随着列表数据规模的增大,效率也会加大。
- len(string)
返回字符串的长度。
7. str 判断
判断 str 开头 - startswith()
string.startswith(prefix_str[, start[, end]]) -> bool
判断在指定区间内[start, end),字符串string是否是以 prefix_str开头。
判断 str 结尾 - endswith()
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. 占位符:%+格式字符,如 %s、%d等
1. 占位符中间可以插入修饰字符,如%03d,表示整型数字占3个位置,不够时前面补 0;
1. 格式字符串和被格式的值之间固定用 % 分割;
1. value 是一个对象,如或是一个字符串,或一个元组,或一个字典
- **format() 格式化 ********
```python
'{} {n} {xxx}'.format(*args, **kwargs) -> str
说明:
- args 是位置参数,是一个元组/列表;kwargs 是关键字参数,是一个字典;
- 花括号 { } 表示占位符;
- 空花括号 {} 是按照顺序匹配位置参数,带索引的 {n} 则取参数中对应索引的值,{xxx} 取关键字中key的值;
- 如打印花括号,则 {{}}
【实例 6】几种常见的格式化访问
# 位置参数
'{}:{}'.format('192.168.10.123', 8888)
# 关键字或命名参数
'{protocol}://{1}:{0}'.format(8888, '192.168.10.123', protocol='https')
# 索引访问元素
'{0[0]}:{0[1]}'.format(['192.168.10.123', 8888])
# 对象属性访问
from collections import namedtuple
Point = namedtuple('Point','x y')
p = Point(4,5)
"{{{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 | 十六进制 |
说明
- 冒号:前面表示索引值或引用之类;
- 冒号: 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充;
- ^, <, > 分别是居中、左对齐、右对齐,后面带宽度;
- b、d、o、x :分别是二进制、十进制、八进制、十六进制;
- 此外可以使用大括号 { } 来转义大括号,如下 ```python “{1} 对应的索引位置是 {{1}}”.format(“hello”, “world”) # ‘world 对应的索引位置是 {1}’
“{1} 对应的索引位置是 {{{1}}}”.format(“hello”, “world”) # ‘world 对应的索引位置是 {world}’ ``` 注意大括号的使用。