HOWTO · Python
在 Python 中从字符串中删除某些字符
本教程演示了如何在 Python 中从一个字符串中删除某些字符。
本页内容
使用 str.replace() 删除已知子字符串,使用 str.translate() 删除多个单独字符,使用列表推导式保留符合条件的字符,或者在要删除的字符由某种模式描述时使用 re.sub()。每种方法都会返回一个新字符串:Python 字符串不可变,因此原始值仍可使用。下面的四个示例均已成功执行,且每个示例都输出了 Hello World。
使用 str.replace() 删除指定字符
str.replace(old, new) 会将某个子字符串的所有出现位置替换为另一个子字符串。将替换内容设为 "" 即可删除该子字符串。目标明确且数量不多时,这种做法一目了然;要处理少量目标,也可以重复调用。
下面的示例会从一句问候语中删除两个已知子字符串:
本节中的代码以及显示的标签或输出仍为英文。
source = "Hello, World!"
cleaned = source.replace(",", "").replace("!", "")
print(cleaned)
这些调用会删除所有位置上的逗号和感叹号,但不会修改 source;如果后续代码要使用清理后的文本,请将返回值赋给变量。replace() 也能删除较长的已知子字符串,因此当目标是单词或字符序列时也适用,并不局限于单个字符。若要处理较长的单字符列表,使用转换表或过滤方式会更易于维护。
使用 str.translate() 删除多个字符
使用 str.maketrans() 的第三个参数,为一组单独字符构建删除表,然后将该表传给 str.translate()。表中列出的每个字符都会在所有出现位置被删除;这种方式不会匹配任意的多字符子字符串。
本节中的代码以及显示的标签或输出仍为英文。
source = "Hello, World!"
remove_chars = ",!"
table = str.maketrans("", "", remove_chars)
cleaned = source.translate(table)
print(cleaned)
修改 remove_chars 即可控制要删除哪些字符。当规则是一组固定字符时,这种方式很合适。str.maketrans() 也可用于指定字符替换,但第三个参数专门用于标记要删除的字符。如果规则取决于某项条件,请改用过滤方式。
过滤字符并连接结果
列表推导式可以清楚表达保留规则:遍历输入内容,只保留不在删除集合中的字符。然后对分隔符字符串调用 str.join(),将保留的字符组合起来。此处使用的空分隔符会直接连接字符,不添加其他文本。
本节中的代码以及显示的标签或输出仍为英文。
source = "Hello, World!"
remove_chars = set(",!")
cleaned = "".join(char for char in source if char not in remove_chars)
print(cleaned)
可以使用能表达保留规则的条件,例如用 char.isdigit() 只保留数字。该条件会针对每个字符进行判断,因此可以表达比固定删除表更灵活的规则。分隔符决定结果的形式:" ".join(...) 会在保留的项目之间插入空格,而 "".join(...) 会将相邻字符直接连接。join() 负责组合可迭代对象中的内容,本身并不执行过滤。
使用 re.sub() 删除匹配模式的字符
re.sub(pattern, replacement, text) 会替换正则表达式模式的每个匹配项。字符类可以列出多个备选字符,并逐个匹配;将替换内容设为空字符串即可删除每个匹配项。如果使用原始字符串能让反斜杠更易读,可以将模式写成原始字符串。
本节中的代码以及显示的标签或输出仍为英文。
import re
source = "Hello, World!"
cleaned = re.sub(r"[,!]", "", source)
print(cleaned)
字符类 [,!] 会匹配逗号或感叹号。要删除某个范围或类别的字符,可以在模式中表达相应规则;请仔细阅读并测试此类模式,因为标点符号在正则表达式中可能具有特殊含义。如果某个字符在正则表达式中具有特殊作用,但你希望按字面匹配它,请对其进行转义。对于简短的固定字符集合,使用 str.translate() 往往更易读;如果重点在于按模式匹配,则选择 re.sub()。
选择合适的方法并了解其限制
根据要删除的文本如何指定来选择方法:
- 对于一个已知子字符串或少量明确的替换操作,使用
str.replace()。 - 对于删除一组固定的单独字符,使用
str.translate()。 - 当规则是针对每个字符的条件时,使用列表推导式和
str.join()。 - 当要删除的内容由正则表达式模式描述时,使用
re.sub()。
这些操作只会删除参数指定的内容。它们不会自动去除周围空白、规范化 Unicode,也不会将大写和小写字母视为相同字符。如果删除操作应忽略大小写,请明确指定要匹配的大小写形式,或使用不区分大小写的匹配规则;同时要注意,将源文本转换为小写或大写会改变文本本身。除非确实需要这种改变,否则不要只为了删除字符而进行大小写转换。这些示例展示了各方法的基本用法;选择方法时无需假定它们之间存在速度差异。优先采用最清晰地表达当前数据处理规则的方法;如果性能很重要,再使用有代表性的输入进行测量。