专项练习 · 9 分钟阅读

Python 正则练习:查找、提取与替换

正则表达式是一种描述文本模式的紧凑语言。先写一个清楚的模式,在小字符串上测试,再添加分组或量词。

使用原始字符串

正则模式写成原始字符串,例如 r"\d+"。r 前缀会阻止 Python 提前解释反斜杠,让正则引擎收到原本的模式。这样可以避免一类常见的困惑。

import re
print(re.findall(r"\d+", "a1 b22 c333"))

用原始字符串匹配数字

查找一个匹配

re.search 返回第一次出现的匹配对象;没有匹配时返回 None。用 group() 读取文本。输入来自用户或文件时,尤其要先判断 None。

import re
match = re.search(r"\d+", "Order 42")
if match:
    print(match.group())

先判断再读取

找出所有匹配

re.findall 返回所有不重叠匹配组成的列表。字符类让一个模式匹配一组字符:[A-Z] 查找大写字母。字符类可以配合量词描述重复。

import re
print(re.findall(r"[A-Z]", "pyTHON"))
print(re.findall(r"\d+", "a1 b22"))

收集所有匹配

替换文本

re.sub 会把每个匹配替换成指定字符串。\s+ 这样的模式匹配连续空白。先在小样本上测试替换,再应用到整份文档。

import re
text = "latte   tea  mocha"
print(re.sub(r"\s+", " ", text))

规范化空格

校验简单的形状

re.fullmatch 检查整个字符串是否匹配模式。这里的 \d{3}-\d{4} 表示三个数字、一个连字符、四个数字。调用者只关心是否有效时,返回布尔值即可。

import re
phone = "555-1234"
print(bool(re.fullmatch(r"\d{3}-\d{4}", phone)))

整串校验

你的练习清单

常见问题

为什么正则模式要用 r"..."?

原始字符串保留反斜杠,让正则引擎收到你原本想写的模式。

search 和 findall 有什么区别?

search 返回第一个匹配对象或 None;findall 返回所有匹配字符串组成的列表。

什么时候不该用正则?

split、replace、startswith 等简单字符串方法已经能清楚表达规则时,就不需要正则。正则适合真正基于模式的文本。

练习正则表达式

12 道题,覆盖 search、findall、sub、字符类和原始字符串。

打开练习

继续阅读: