如何在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 │ └────────────────────────────────┴─────────────────────┴─────────────────────┴─────────────────┘
尝试过的代码及问题:
- 错误使用
str.extract_all(该方法针对字符串列,需正则参数,不适用列表列):
day3.select( pl.col("Compartment_1").str.extract_all(pl.col("Compartment_2")) )
- 将
Compartment_2转为REGEX列后传入,结果全为Null; - 尝试
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
相关产品推荐
相关产品推荐

