Files

378 lines
8.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
doc_type: short
full_text: sources/04_Strings.md
---
# 04_Strings 总结
本文介绍 Python 中用于处理文本的核心类型 `str`,涵盖字符串字面量、转义字符、Unicode 表示、索引与切片、常用操作和方法、不可变性、类型转换、字节串、原始字符串、f-string,以及与正则表达式的初步衔接。相关主题可延伸到 Python字符串、Unicode与编码、Python不可变对象、Python格式化字符串、[[concepts/正则表达式]]。
## 字符串字面量
Python 字符串可以用单引号、双引号或三引号表示:
```python
a = 'Yeah but no but yeah but...'
b = "computer says no"
c = '''
多行文本
会保留换行和格式
'''
```
要点:
- 单引号和双引号没有语义差别。
- 字符串必须用相同类型的引号开始和结束。
- 普通字符串通常只能写在一行。
- 三引号字符串可以跨多行,并保留其中的格式。
## 转义字符
转义序列用于表示不方便直接输入的字符或控制字符:
```python
'\n' # 换行
'\r' # 回车
'\t' # 制表符
'\'' # 单引号
'\"' # 双引号
'\\' # 反斜杠
```
这与 Python字符串 和 文本表示 有关。
## Unicode 字符表示
Python 字符串中的字符在内部以 Unicode code point 表示。可以通过不同形式的转义指定具体字符:
```python
a = '\xf1' # 'ñ'
b = '\u2200' # '∀'
c = '\U0001D122' # '𝄢'
d = '\N{FOR ALL}' # '∀'
```
Unicode 字符数据库可用于查询字符编码。该部分与 Unicode与编码 密切相关。
## 字符串索引与切片
字符串可以像数组一样按位置访问字符,索引从 `0` 开始:
```python
a = 'Hello world'
a[0] # 'H'
a[4] # 'o'
a[-1] # 'd'
```
负索引从字符串末尾开始计算。
切片使用 `:` 选择子串:
```python
a[:5] # 'Hello'
a[6:] # 'world'
a[3:8] # 'lo wo'
a[-5:] # 'world'
```
切片规则:
- 结束索引位置的字符不包含在结果中。
- 省略起始索引表示从开头开始。
- 省略结束索引表示一直到末尾。
这与 Python序列、索引与切片 相关。
## 字符串基本操作
常见字符串操作包括拼接、求长度、成员测试和重复:
```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` 的前两个字符。
## 字符串方法
字符串对象提供大量方法用于测试和处理文本。
### 去除空白
```python
s = ' Hello '
s.strip() # 'Hello'
```
### 大小写转换
```python
s = 'Hello'
s.lower() # 'hello'
s.upper() # 'HELLO'
```
### 文本替换
```python
s = 'Hello world'
s.replace('Hello', 'Hallo') # 'Hallo world'
```
### 常见方法列表
```python
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字符串方法。
## 字符串不可变性
字符串是不可变对象,创建后不能原地修改:
```python
s = 'Hello World'
s[1] = 'a' # TypeError
```
所有看似修改字符串的操作,实际上都会创建一个新字符串。例如:
```python
symbols = symbols + ',GOOG'
symbols = symbols.replace('SCO', 'DOA')
```
变量名只是重新绑定到新字符串,原来的字符串没有被修改。这个概念与 Python不可变对象 和 变量绑定 相关。
## 字符串转换
`str()` 可以把任意值转换成字符串,结果通常与 `print()` 输出的文本一致:
```python
x = 42
str(x) # '42'
```
这部分与 Python类型转换 相关。
## 字节串 bytes
字节串表示 8 位字节序列,常见于底层 I/O 或网络数据:
```python
data = b'Hello World\r\n'
```
常见字符串操作也可用于字节串:
```python
len(data) # 13
data[0:5] # b'Hello'
data.replace(b'Hello', b'Cruel') # b'Cruel World\r\n'
```
但字节串索引返回整数:
```python
data[0] # 72,即字符 'H' 的 ASCII 码
```
文本字符串和字节串之间需要通过编码转换:
```python
text = data.decode('utf-8') # bytes -> str
data = text.encode('utf-8') # str -> bytes
```
常见编码包括 `'utf-8'`、`'ascii'`、`'latin1'`。这与 Unicode与编码、Python字节串 相关。
## 原始字符串 raw string
原始字符串使用前缀 `r`,其中的反斜杠不会被解释为转义序列:
```python
rs = r'c:\newdata\test'
```
实际内容按字面形式处理,常用于:
- Windows 文件路径
- 正则表达式
- 其他大量使用反斜杠的文本场景
这与 [[concepts/正则表达式]] 有直接联系。
## f-string 格式化字符串
f-string 用于在字符串中嵌入表达式,并支持格式控制:
```python
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:字符和子串提取
使用如下字符串:
```python
symbols = 'AAPL,IBM,MSFT,YHOO,SCO'
```
练习内容:
- 用正索引提取字符。
- 用负索引提取末尾字符。
- 尝试修改字符并观察 `TypeError`,理解字符串不可变性。
### Exercise 1.14:字符串拼接
练习将 `'GOOG'` 添加到字符串末尾,以及将 `'HPQ'` 添加到开头。
重点是理解:
- 拼接产生新字符串。
- 变量重新绑定到新字符串。
- 原字符串没有被原地修改。
### Exercise 1.15:成员测试
通过 `in` 判断子串是否存在:
```python
'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` 模块:
```python
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() 探索对象方法
当需要查看字符串支持哪些操作时,可以使用:
```python
dir(s)
```
它会列出对象可用的方法和属性。
若要查看某个方法的说明,可使用:
```python
help(s.upper)
```
这体现了 Python 交互式探索和自省能力,相关主题包括 Python交互式解释器、Python自省。
## 核心结论
- Python 字符串是用于处理文本的基本类型。
- 字符串可以通过单引号、双引号、三引号表示。
- 转义字符用于表示换行、制表符、引号、反斜杠等特殊字符。
- 字符串内部基于 Unicode code point。
- 字符串支持索引、负索引和切片。
- 常用操作包括拼接、长度、成员测试和重复。
- 字符串方法返回新字符串,不会修改原字符串。
- 字符串是不可变对象。
- `str()` 可将对象转换为字符串。
- `bytes` 表示字节序列,需要通过 `encode()` 和 `decode()` 与文本互转。
- 原始字符串适合路径和正则表达式。
- f-string 是现代 Python 中推荐的字符串格式化方式。
- 更复杂的模式匹配应使用 `re` 模块。
## Related Concepts
- [[concepts/Unicode-与编码]]
- [[concepts/Python-不可变对象]]
- [[concepts/字符串处理]]
- [[concepts/Python-输入输出]]
- [[concepts/Python-文档与帮助系统]]
- [[concepts/变量与数据类型]]
- [[concepts/Python-交互式解释器]]
- [[concepts/列表与序列]]
- [[concepts/Python-运算符与表达式]]
- [[concepts/文件读写]]
- [[concepts/模块与-import]]