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

如何从Pandas DataFrame字符串列中提取恰好连续4位的数字

Pandas 提取DataFrame中恰好4位连续数字的实现方法

需求说明

现有基于大文本文件生成的Pandas DataFrame,需要从pattern列完成两个操作:

  • 筛选出包含恰好4位连续数字的行
  • 提取所有符合规则的4位连续数字串

匹配规则说明:

字符串a1234bc5678符合要求,可提取到1234、5678两个4位数字串;但a12345不符合要求,其连续数字长度为5,不满足恰好4位的要求。

示例数据

print (df.sample(20))

              pattern
13457358     187019980
9892646         920204
2258941        dong998
5792706     diao511001
9144372       a2805938
15519502       YUEH008
15831448     752099429
15659305     469919209
13769825      majunsui
3446320       sishenD2
12970622     woaini123
11633295      guswjddl
12708217  342423198706
2079106     zj87755202
12551254   mxt19950626
4572063        1985625
7805173     theend0512
484820      jzm5583385
15017582       1981122
10868176      30061984

原有方案问题

最初直接用\d{4}匹配4位数字,会把长度超过4的连续数字中的片段也匹配出来,不符合要求,示例代码如下:

text = '1234sunwei198734'
postcodes = re.findall('\d{4}',text)
print(postcodes)

上述代码会输出['1234', '1987'],但1987是长数字198734的片段,不属于恰好4位的连续数字,不符合规则。

最终实现方案

通过零宽断言限定匹配到的4位数字前后都不能是数字,即可保证匹配到的连续数字长度恰好为4,代码如下:

# 提取所有符合要求的4位连续数字存入pins列
df2['pins'] = df2['pattern'].apply(lambda x: re.findall('(?<!\d)\d{4}(?!\d)',x))
# 筛选出至少包含一个符合要求的4位数字的行
df3 = df2[df2['pins'].apply(lambda x: len(x)) > 0]

正则规则说明:

  • (?<!\d):负向后行断言,限定匹配位置的前一个字符不能是数字
  • \d{4}:匹配连续4位数字
  • (?!\d):负向前瞻断言,限定匹配位置的后一个字符不能是数字

内容的提问来源于stack exchange,提问作者A l w a y s S u n n y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:18:03