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)))整串校验
你的练习清单
- 模式使用原始字符串。
- search 返回 None 时不要调用 group()。
- 先在小输入上测试模式。
- 优先使用清楚的字符类,而不是炫技的复杂模式。
常见问题
为什么正则模式要用 r"..."?
原始字符串保留反斜杠,让正则引擎收到你原本想写的模式。
search 和 findall 有什么区别?
search 返回第一个匹配对象或 None;findall 返回所有匹配字符串组成的列表。
什么时候不该用正则?
split、replace、startswith 等简单字符串方法已经能清楚表达规则时,就不需要正则。正则适合真正基于模式的文本。
练习正则表达式
12 道题,覆盖 search、findall、sub、字符类和原始字符串。
继续阅读: