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

如何在PyPolars中结合REGEX列使用str.extract_all提取共同字符

问题描述

需求:提取Polars DataFrame中Compartment_1和Compartment_2两列(均为字符列表类型)每行的共同字符。

数据结构如下:

shape: (20, 4)
┌────────────────────────────────┬───────────────────┬───────────────────┬─────────────────────┐
│ Original                       ┆ Compartment_1     ┆ Compartment_2     ┆ REGEX               │
│ ---                            ┆ ---               ┆ ---               ┆ ---                 │
│ str                            ┆ list[str]         ┆ list[str]         ┆ str                 │
╞════════════════════════════════╪═══════════════════╪═══════════════════╪═════════════════════╡
│ DsPhSBQQQhqmBDhPDsFwjwsLjlRjlt ┆ ["D", "s", … "F"] ┆ ["w", "j", … "b"] ┆ wjwsLjlRjlttvjvvtRb │
│ tv…                            ┆                   ┆                   ┆                     │
│ rNJMNNbrHrtjHLHjvwtg           ┆ ["r", "N", … "r"] ┆ ["t", "j", … "g"] ┆ tjHLHjvwtg          │
│ fNbNzZdrZnMnMPnQShFPDmnqFm     ┆ ["f", "N", … "M"] ┆ ["P", "n", … "m"] ┆ PnQShFPDmnqFm       │
│ QWVCFfQffgQCVZzVVpHsHJBqtpspJF ┆ ["Q", "W", … "V"] ┆ ["p", "H", … "q"] ┆ pHsHJBqtpspJFRHqq   │
│ RH…                            ┆                   ┆                   ┆                     │
│ …                              ┆ …                 ┆ …                 ┆ …                   │
│ ZnJHRncHHgnrsrZffTdMdMBfmMvfvR ┆ ["Z", "n", … "Z"] ┆ ["f", "f", … "R"] ┆ ffTdMdMBfmMvfvR     │
│ NWWPnZrVHrZPCDDQtzDCPLCq       ┆ ["N", "W", … "P"] ┆ ["C", "D", … "q"] ┆ CDDQtzDCPLCq        │
│ jpFjvBZhDFHZdwcmslcslBLLNl     ┆ ["j", "p", … "d"] ┆ ["w", "c", … "l"] ┆ wcmslcslBLLNl       │
│ dVtTVVCzzfrrMPNLLcnVcPLRns     ┆ ["d", "V", … "M"] ┆ ["P", "N", … "s"] ┆ PNLLcnVcPLRns       │
└────────────────────────────────┴─────────────────────┴─────────────────────┴─────────────────┘

尝试过的代码及问题:

  1. 错误使用str.extract_all(该方法针对字符串列,需正则参数,不适用列表列):
day3.select(
    pl.col("Compartment_1").str.extract_all(pl.col("Compartment_2"))
)
  1. 将Compartment_2转为REGEX列后传入,结果全为Null;
  2. 尝试list.eval但因错误处理列引用(str(pl.col("REGEX"))会把列对象转为字符串而非取值)失败:
day3_3 = day3_2.with_columns(
    pl.col("Compartment_1")
    .list.eval(
        pl.element()
        .str.extract_all(pattern = str(pl.col("REGEX")))
    ).alias("Match")
)
解决方法

Polars内置了列表交集方法list.set_intersection,直接用于两列即可高效提取共同字符,无需正则:

基础实现

day3 = day3.with_columns(
    pl.col("Compartment_1").list.set_intersection(pl.col("Compartment_2")).alias("Common_Chars")
)

进阶处理(去重+排序)

如果需要对结果去重并排序,可追加list.unique()和list.sort():

day3 = day3.with_columns(
    pl.col("Compartment_1")
    .list.set_intersection(pl.col("Compartment_2"))
    .list.unique()
    .list.sort()
    .alias("Common_Chars")
)

错误原因说明

  • str.extract_all是字符串处理方法,用于从单个字符串中提取正则匹配项,不能直接处理列表列;
  • list.eval中使用str(pl.col("REGEX"))会将列表达式对象转为字符串(如<Expr ['REGEX']>),而非获取每行的实际REGEX值,导致匹配失败返回Null;
  • 求列表交集无需绕正则,Polars的list.set_intersection是专门为此场景设计的优化方法。

内容的提问来源于stack exchange,提问作者Damon C. Roberts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:40:21