Files
coding-mentor-agent/kb/python-course-kb-practical-python/wiki/summaries/04_Strings.md
T

8.9 KiB
Raw Blame History

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 模块。