8.9 KiB
doc_type, full_text
| doc_type | full_text |
|---|---|
| short | sources/04_Strings.md |
04_Strings 总结
本文介绍 Python 中用于处理文本的核心类型 str,涵盖字符串字面量、转义字符、Unicode 表示、索引与切片、常用操作和方法、不可变性、类型转换、字节串、原始字符串、f-string,以及与正则表达式的初步衔接。相关主题可延伸到 Python字符串、Unicode与编码、Python不可变对象、Python格式化字符串、concepts/正则表达式。
字符串字面量
Python 字符串可以用单引号、双引号或三引号表示:
a = 'Yeah but no but yeah but...'
b = "computer says no"
c = '''
多行文本
会保留换行和格式
'''
要点:
- 单引号和双引号没有语义差别。
- 字符串必须用相同类型的引号开始和结束。
- 普通字符串通常只能写在一行。
- 三引号字符串可以跨多行,并保留其中的格式。
转义字符
转义序列用于表示不方便直接输入的字符或控制字符:
'\n' # 换行
'\r' # 回车
'\t' # 制表符
'\'' # 单引号
'\"' # 双引号
'\\' # 反斜杠
这与 Python字符串 和 文本表示 有关。
Unicode 字符表示
Python 字符串中的字符在内部以 Unicode code point 表示。可以通过不同形式的转义指定具体字符:
a = '\xf1' # 'ñ'
b = '\u2200' # '∀'
c = '\U0001D122' # '𝄢'
d = '\N{FOR ALL}' # '∀'
Unicode 字符数据库可用于查询字符编码。该部分与 Unicode与编码 密切相关。
字符串索引与切片
字符串可以像数组一样按位置访问字符,索引从 0 开始:
a = 'Hello world'
a[0] # 'H'
a[4] # 'o'
a[-1] # 'd'
负索引从字符串末尾开始计算。
切片使用 : 选择子串:
a[:5] # 'Hello'
a[6:] # 'world'
a[3:8] # 'lo wo'
a[-5:] # 'world'
切片规则:
- 结束索引位置的字符不包含在结果中。
- 省略起始索引表示从开头开始。
- 省略结束索引表示一直到末尾。
这与 Python序列、索引与切片 相关。
字符串基本操作
常见字符串操作包括拼接、求长度、成员测试和重复:
'Hello' + 'World' # 拼接
len('Hello') # 长度:5
'e' in 'Hello' # True
'x' in 'Hello' # False
'hi' not in 'Hello' # True
'Hello' * 5 # 重复
in 判断的是子串是否存在,而不仅仅是完整单词或独立符号。例如 'AA' in 'AAPL,...' 会返回 True,因为 AA 是 AAPL 的前两个字符。
字符串方法
字符串对象提供大量方法用于测试和处理文本。
去除空白
s = ' Hello '
s.strip() # 'Hello'
大小写转换
s = 'Hello'
s.lower() # 'hello'
s.upper() # 'HELLO'
文本替换
s = 'Hello world'
s.replace('Hello', 'Hallo') # 'Hallo world'
常见方法列表
s.endswith(suffix)
s.find(t)
s.index(t)
s.isalpha()
s.isdigit()
s.islower()
s.isupper()
s.join(slist)
s.lower()
s.replace(old, new)
s.rfind(t)
s.rindex(t)
s.split([delim])
s.startswith(prefix)
s.strip()
s.upper()
这些方法体现了 Python 对文本处理的内建支持,可归入 Python字符串方法。
字符串不可变性
字符串是不可变对象,创建后不能原地修改:
s = 'Hello World'
s[1] = 'a' # TypeError
所有看似修改字符串的操作,实际上都会创建一个新字符串。例如:
symbols = symbols + ',GOOG'
symbols = symbols.replace('SCO', 'DOA')
变量名只是重新绑定到新字符串,原来的字符串没有被修改。这个概念与 Python不可变对象 和 变量绑定 相关。
字符串转换
str() 可以把任意值转换成字符串,结果通常与 print() 输出的文本一致:
x = 42
str(x) # '42'
这部分与 Python类型转换 相关。
字节串 bytes
字节串表示 8 位字节序列,常见于底层 I/O 或网络数据:
data = b'Hello World\r\n'
常见字符串操作也可用于字节串:
len(data) # 13
data[0:5] # b'Hello'
data.replace(b'Hello', b'Cruel') # b'Cruel World\r\n'
但字节串索引返回整数:
data[0] # 72,即字符 'H' 的 ASCII 码
文本字符串和字节串之间需要通过编码转换:
text = data.decode('utf-8') # bytes -> str
data = text.encode('utf-8') # str -> bytes
常见编码包括 'utf-8'、'ascii'、'latin1'。这与 Unicode与编码、Python字节串 相关。
原始字符串 raw string
原始字符串使用前缀 r,其中的反斜杠不会被解释为转义序列:
rs = r'c:\newdata\test'
实际内容按字面形式处理,常用于:
- Windows 文件路径
- 正则表达式
- 其他大量使用反斜杠的文本场景
这与 concepts/正则表达式 有直接联系。
f-string 格式化字符串
f-string 用于在字符串中嵌入表达式,并支持格式控制:
name = 'IBM'
shares = 100
price = 91.1
f'{name:>10s} {shares:10d} {price:10.2f}'
# ' IBM 100 91.10'
f'Cost = ${shares*price:0.2f}'
# 'Cost = $9110.00'
要点:
- f-string 需要 Python 3.6 或更高版本。
{}中可以放变量或表达式。- 冒号后可写格式说明,如宽度、对齐、小数位数等。
相关主题:Python格式化字符串、Python输出格式化。
练习内容概览
本文练习围绕交互式解释器展开,主要目标是熟悉字符串行为。
Exercise 1.13:字符和子串提取
使用如下字符串:
symbols = 'AAPL,IBM,MSFT,YHOO,SCO'
练习内容:
- 用正索引提取字符。
- 用负索引提取末尾字符。
- 尝试修改字符并观察
TypeError,理解字符串不可变性。
Exercise 1.14:字符串拼接
练习将 'GOOG' 添加到字符串末尾,以及将 'HPQ' 添加到开头。
重点是理解:
- 拼接产生新字符串。
- 变量重新绑定到新字符串。
- 原字符串没有被原地修改。
Exercise 1.15:成员测试
通过 in 判断子串是否存在:
'IBM' in symbols
'AA' in symbols
'CAT' in symbols
重点是理解 in 检查的是任意子串匹配,而不是按逗号分隔后的完整股票代码匹配。
Exercise 1.16:字符串方法
练习:
lower():转换为小写。find():查找子串位置。- 切片提取子串。
replace():替换文本。strip():去除首尾空白。
并再次强调:字符串方法返回新字符串,不修改原字符串。
Exercise 1.17:f-string
要求修改前一节的 mortgage.py 程序,使用 f-string 生成格式整齐的输出。
该练习将字符串格式化与数值计算输出结合起来,连接到 summaries/03_Numbers 和 Python格式化字符串。
Exercise 1.18:正则表达式
基础字符串方法不支持高级模式匹配。复杂文本搜索与替换需要使用 re 模块:
import re
text = 'Today is 3/27/2018. Tomorrow is 3/28/2018.'
re.findall(r'\d+/\d+/\d+', text)
# ['3/27/2018', '3/28/2018']
re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
# 'Today is 2018-3-27. Tomorrow is 2018-3-28.'
这里展示了两个核心操作:
re.findall():查找所有匹配。re.sub():按模式替换文本。
相关主题:concepts/正则表达式、Python文本处理。
使用 dir() 和 help() 探索对象方法
当需要查看字符串支持哪些操作时,可以使用:
dir(s)
它会列出对象可用的方法和属性。
若要查看某个方法的说明,可使用:
help(s.upper)
这体现了 Python 交互式探索和自省能力,相关主题包括 Python交互式解释器、Python自省。
核心结论
- Python 字符串是用于处理文本的基本类型。
- 字符串可以通过单引号、双引号、三引号表示。
- 转义字符用于表示换行、制表符、引号、反斜杠等特殊字符。
- 字符串内部基于 Unicode code point。
- 字符串支持索引、负索引和切片。
- 常用操作包括拼接、长度、成员测试和重复。
- 字符串方法返回新字符串,不会修改原字符串。
- 字符串是不可变对象。
str()可将对象转换为字符串。bytes表示字节序列,需要通过encode()和decode()与文本互转。- 原始字符串适合路径和正则表达式。
- f-string 是现代 Python 中推荐的字符串格式化方式。
- 更复杂的模式匹配应使用
re模块。