Python pandas基于DataFrame现有列提取指定模式生成新列
Pandas 字段提取问题解决方案
需求说明
需要基于DataFrame的现有crate列创建新列main_cr,取值规则为:提取crate列值中第一个冒号之后、最后一个冒号之前的内容(不包含首尾冒号)。
原始数据
site stat crate JJ - site 1 ok JD1:0055:AB5.30:100 JJ - site 1 ok JD1:00AB:AB5.30:111 J1 - site 2 fail JD1:00AA:AB5.30:200 JJ - site 1 ok JD1:00A:AB5.30:555 CC - site 8 fail CC5:01AAA:BA8.40:777
期望输出
site stat main_cr crate JJ - site 1 ok 0055:AB5.30 JD1:0055:AB5.30:100 JJ - site 1 ok 00AB:AB5.30 JD1:00AB:AB5.30:111 J1 - site 2 fail 00AA:AB5.30 JD1:00AA:AB5.30:200 JJ - site 1 ok 00A:AB5.30 JD1:00A:AB5.30:555 CC - site 8 fail 01AAA:BA8.40 CC5:01AAA:BA8.40:777
现存问题
当前尝试的正则代码存在语法错误、匹配范围过窄的问题,无法得到正确结果:
df['main_cr']=df['crate'].str.extract(r':(\d):.*):')
具体错误点:
- 正则括号不配对,语法不合法
\d仅能匹配单个数字,无法覆盖目标内容中的字母、点号、多段冒号分隔的文本- 没有锚定字符串首尾位置,容易出现匹配错位
正确实现代码
使用正则锚定首尾结构,捕获第一个冒号到最后一个冒号之间的所有内容即可:
import pandas as pd # 提取目标内容 df['main_cr'] = df['crate'].str.extract(r'^[^:]+:(.*):[^:]+$') # 按期望顺序调整列顺序 df = df[['site', 'stat', 'main_cr', 'crate']]
正则逻辑说明
^[^:]+::匹配字符串开头到第一个冒号的所有内容,跳过第一个冒号前的前缀部分(.*):捕获组,贪婪匹配模式下会自动匹配到最后一个冒号之前的所有内容,也就是需要的目标值:[^:]+$:匹配最后一个冒号到字符串结尾的后缀部分,确保前面的捕获组不会越界
该写法兼容中间段包含任意数量冒号、字母、数字、特殊符号的场景,不需要提前固定分隔段数。
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

