如何从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
相关产品推荐
相关产品推荐

