--- 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]]