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

如何在Polars DataFrame中统计字符串列中子串的重叠出现次数?

在Polars DataFrame中统计字符串列的重叠子串出现次数

Polars自带的pl.Expr.str.count_matches方法默认只会统计非重叠的子串匹配次数,无法满足重叠计数的需求。要统计重叠出现的次数,最直接高效的方法是利用**正则正向预查(positive lookahead)**来实现——预查不会消耗字符串中的字符,能连续匹配重叠的子串位置。

示例实现

import polars as pl

df = pl.DataFrame({"foo": ["aaaaa", "aabaa", "aaaab"]})

# 用正向预查正则统计重叠子串次数
df = df.with_columns(
    pl.col("foo").str.count_matches(r"(?=aa)").alias("overlap_aa_count")
)

print(df)

执行结果

shape: (3, 2)
┌───────┬────────────────┐
│ foo   ┆ overlap_aa_count │
│ ---   ┆ ---              │
│ str   ┆ u32              │
╞═══════╪══════════════════╡
│ aaaaa ┆ 4                │
│ aabaa ┆ 2                │
│ aaaab ┆ 3                │
└───────┴──────────────────┘

原理说明

正则表达式(?=aa)是正向预断言,它的作用是检查当前位置之后是否存在子串"aa",但匹配后不会移动正则的匹配指针。这样在遍历字符串时,每一个能找到后续"aa"的位置都会被计数一次:

  • 对于"aaaaa",位置0、1、2、3都满足后续有"aa",所以计数为4;
  • 对于"aabaa",只有位置0和3满足,计数为2;
  • 对于"aaaab",位置0、1、2满足,计数为3。

这种方法完全基于Polars原生API实现,不需要额外的循环或转换,性能最优,适合处理大规模数据集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:11:09