
本文介绍如何使用 Polars 的 str.extract() 方法,通过带捕获组的正则表达式,从字符串列中提取首个匹配子串并生成新列,替代仅返回布尔值的 str.contains()。
本文介绍如何使用 polars 的 `str.extract()` 方法,通过带捕获组的正则表达式,从字符串列中提取首个匹配子串并生成新列,替代仅返回布尔值的 `str.contains()`。
在 Polars 中,若需从字符串列中提取特定模式(如数字、关键字等)的首个匹配项并存为新列,不能直接使用 str.contains() —— 它仅返回 True/False,用于过滤而非提取。正确做法是结合正则捕获组与 str.extract() 表达式方法。
str.extract(pattern) 会扫描每行字符串,返回第一个成功匹配捕获组 (…) 的内容;若无匹配,则自动填充 null(Polars 的缺失值表示),完美契合示例需求。
以下为完整实现:
import polars as pl
df = pl.DataFrame({"col": ["row1", "row2", "row3"]})
result = df.with_columns(
new=pl.col("col").str.extract(r"(1|2)")
)
print(result)输出:
shape: (3, 2) ┌──────┬──────┐ │ col ┆ new │ │ --- ┆ --- │ │ str ┆ str │ ╞══════╪══════╡ │ row1 ┆ 1 │ │ row2 ┆ 2 │ │ row3 ┆ null │ └──────┴──────┘
✅ 关键要点:
- 正则模式必须包含显式捕获组:用圆括号
(...)包裹目标子模式(如(1|2)),否则extract()无法定位返回内容; -
r"(1|2)"使用原始字符串(r"")避免反斜杠转义问题; - 若模式含多个捕获组,
extract()仅返回第一个组的匹配结果; - 不支持全局匹配(如提取所有
1和2),如需全部匹配,请用str.extract_all()并配合list.first()或arr.get(0); - 性能高效,全程向量化,无需
.apply()或 Python 循环。
⚠️ 注意:
str.extract()匹配的是子串,非全字符串匹配。若需确保匹配位于特定位置(如结尾),可增强正则,例如r"(\d+)$"提取末尾数字。

















