You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Polars原生方法匹配每行字符串与多组模式列表?

Polars原生实现多模式全匹配方案

示例数据

先定义两个测试用DataFrame:

import polars as pl

df_str = pl.DataFrame(
    {"id": [1, 2, 3], "text": ["hello world python", "foo bar baz", "python data analysis"]}
)

df_pat = pl.DataFrame(
    {"pat_id": [101, 102], "patterns": [["python", "world"], ["foo", "baz"]]}
)

实现代码

直接用Polars的向量化操作替代循环:

result = (
    # 给每个模式组加索引,展开模式列表为单行
    df_pat.with_row_index("pat_group_idx")
    .explode("patterns")
    # 交叉关联字符串DataFrame,生成所有组合
    .join(df_str, how="cross")
    # 检查单个模式是否匹配对应文本
    .with_columns(
        matches=pl.col("text").str.contains(pl.col("patterns"), case_sensitive=False)
    )
    # 按模式组+字符串ID分组,验证组内所有模式都匹配
    .group_by(["pat_group_idx", "pat_id", "id", "text"])
    .agg(
        pl.col("matches").all().alias("all_matched"),
        pl.col("patterns").list().alias("matched_patterns")
    )
    # 过滤出全匹配成功的记录
    .filter(pl.col("all_matched"))
    # 整理成目标输出格式
    .select("id", "pat_group_idx", "pat_id", "text", "matched_patterns")
)

print(result)

逻辑说明

  • with_row_index:给每个模式组分配唯一索引,方便后续分组聚合
  • explode:将模式列表拆分为单行,实现逐个模式的匹配检查
  • cross join:生成字符串与模式组的所有可能组合,覆盖全部匹配场景
  • str.contains:完成单个模式与字符串的匹配判断
  • group_by + agg(all()):对每个模式组-字符串组合,验证是否所有模式都匹配成功
  • 最后过滤有效结果并整理字段,得到包含匹配索引和模式的目标输出

该方案完全基于Polars原生向量化操作,避免Python循环带来的性能损耗,数据量越大优势越明显。

内容的提问来源于stack exchange,提问作者mavex857

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:30:56