采集到的原始数据经常是“价格:¥99.00元”这种混合文本,或者是一大段JSON返回包。
你只想要里面的数字“99.00”,或者某个字段的值——这就需要从文本中提取。
影刀里提取数据有4种常用方法: 截取、split分割、正则提取、JSON解析。
我按难度和适用场景排个序,新手从截取开始学,后面慢慢过渡到正则。
一、截取:固定位置取子串(最简单)
适用场景
- 文本格式完全固定,比如
"商品ID:123456789",ID永远是9位数字 - 想取第3个字符到第8个字符
指令位置
文本处理 → 截取字符串
参数设置
- 原始文本:要处理的字符串变量
- 开始位置:从第几个字符开始(从0开始数)
- 字符长度:截取多少位
实战:取固定长度的订单号
原始文本:"订单号:2024101500012345"
想取后面的16位数字。
原始文本 = "订单号:2024101500012345"
# “订单号:”占4个中文字符(注意:中文算1个字符)

订单号 = 截取字符串(原始文本, 4, 16)
# 结果:"2024101500012345"
限制
只能处理位置和长度都固定的场景。
一旦数字长度变化(比如有时15位有时16位),截取就会出错——这时候要用正则。
二、Split分割:按分隔符拆成数组
适用场景
- 文本有明确的分隔符,比如
"苹果,香蕉,橙子"(逗号分隔) - 想取分隔符前后的某一段
指令位置
文本处理 → 分割字符串
参数设置
- 原始文本:待分割的字符串
- 分隔符:比如
","、"|"、":" - 输出到列表:新建一个列表变量
实战:提取“价格:99”中的数字
原始文本 = "价格:99"
# 按冒号分割
分割后列表 = 分割字符串(原始文本, ":")
# 结果:["价格", "99"]
价格 = 分割后列表[1] # 取第二个元素,结果是"99"
实战:处理CSV格式的一行数据
一行Excel数据:"手机,1999,100件"

行数据列表 = 分割字符串("手机,1999,100件", ",")
商品名 = 行数据列表[0] # "手机"
价格 = 行数据列表[1] # "1999"
进阶:多个分隔符连续处理
先按一个分隔符分割,再对结果用另一个分隔符分割。
比如 "姓名:张三|年龄:25",想取年龄值。
第一步分割 = 分割字符串(原始文本, "|") # 得到 ["姓名:张三", "年龄:25"]
年龄部分 = 第一步分割[1] # "年龄:25"
年龄值 = 分割字符串(年龄部分, ":")[1] # "25"
三、正则提取:最强大,学习曲线稍陡
适用场景
- 提取手机号、邮箱、价格数字、日期等有规律但不固定位置的内容
- 文本里有多种干扰字符,但模式固定
指令位置
文本处理 → 正则提取(影刀内置指令,部分版本在“Python代码”里需要手写)
常用正则模式速查
| 要提取的内容 | 正则表达式 | 示例 |
|---|---|---|
| 纯数字(整数) | \d+ | "价格99元" → "99" |
| 带小数点的数字 | \d+\.?\d* | "99.50元" → "99.50" |
| 手机号 | 1[3-9]\d{9} | "13812345678" |
| 邮箱 | \w+@\w+\.\w+ | "test@qq.com" |
| 中文字符 | [\u4e00-\u9fa5]+ | "苹果手机" |
| 日期(YYYY-MM-DD) | \d{4}-\d{2}-\d{2} | "2024-10-15" |
实战:从混合文本中提取价格
原始文本:"商品售价:¥99.00元,已售500件"
想提取 99.00
价格 = 正则提取(原始文本, "\d+\.?\d*")
# 返回第一个匹配的数字串 "99.00"
提取手机号
文本 = "联系电话:13812345678,联系人:张三"
手机号 = 正则提取(文本, "1[3-9]\d{9}")
提取所有匹配项(返回列表)
如果文本里有多个数字,想全部提取:
所有数字列表 = 正则提取所有(原始文本, "\d+")
# 结果:["99", "00", "500"]
# 注意:\d+ 会把小数点的前后数字拆开,用 "\d+\.?\d*" 更好
影刀中写正则的注意点
- 正则提取指令默认返回第一个匹配项
- 要用“正则提取所有”才能拿列表
- 正则里的
\要写双斜杠还是单斜杠?影刀里直接用\d就行,不需要转义
四、JSON解析:处理API返回的结构化数据
适用场景
- 采集到的数据是JSON格式(比如从网页接口直接拿到的响应)
- 需要取某个字段的值,如
{"data":{"name":"张三","age":25}}中的name
指令位置
Python代码(影刀没有纯指令的JSON解析器,需要写几行Python)
标准模板
# 影刀的“Python代码”指令中
import json
# 输入:json_str 变量(字符串类型)
json_str = "{\"name\":\"张三\",\"age\":25}"
# 解析成字典
data = json.loads(json_str)
# 提取字段
name = data.get("name") # "张三"
age = data.get("age") # 25
# 输出到影刀变量(需要提前在“设置变量”中定义输出变量)
print(name) # 可以在影刀日志里看到
# 通过设置输出参数返回
实战:从淘宝API返回包中提取商品标题
假设接口返回:
{
"code": 200,
"data": {
"title": "iPhone 15 手机",
"price": 5999
}
}
Python代码:
import json
response_text = {{原始返回文本}} # 从影刀变量获取
obj = json.loads(response_text)
title = obj["data"]["title"]
price = obj["data"]["price"]
# 输出到影刀变量(假设已定义“标题”和“价格”变量)
# 通过“设置变量”指令或在Python里用影刀SDK
如果没有JSON指令,用split强行解析(不推荐)
JSON结构复杂时用split会非常痛苦,强烈建议学几句Python。
五、四种方法对比与选择
| 方法 | 难度 | 灵活性 | 适用场景 |
|---|---|---|---|
| 截取 | ★☆☆☆☆ | 低 | 固定位置、固定长度 |
| Split分割 | ★★☆☆☆ | 中 | 有固定分隔符 |
| 正则提取 | ★★★☆☆ | 高 | 有规律但位置不固定 |
| JSON解析 | ★★★★☆ | 高 | 结构化数据(API返回) |
选择流程:
- 格式完全固定(位置和长度都知道)→ 截取
- 有明确分隔符(逗号、冒号、竖线)→ split
- 有规律但混杂其他字符(价格、手机号)→ 正则
- 是标准的JSON字符串 → 用Python解析JSON
六、实战案例:从一句话中提取商品信息和价格
原始文本:"商品:华为Mate60,价格:5999元,库存:100件"
方法1:Split分割
# 先按逗号分割成三段
三段 = 分割字符串(原始文本, ",")
# 三段[0]="商品:华为Mate60"
# 三段[1]="价格:5999元"
# 三段[2]="库存:100件"
# 再按冒号取后一半
商品 = 分割字符串(三段[0], ":")[1] # "华为Mate60"
价格带单位 = 分割字符串(三段[1], ":")[1] # "5999元"
# 再提取数字
价格 = 正则提取(价格带单位, "\d+") # "5999"
方法2:正则一次提取(更简洁)
商品 = 正则提取(原始文本, "商品:([^,]+)") # 取“商品:”到逗号之间的内容
价格 = 正则提取(原始文本, "价格:(\d+)") # 取“价格:”后面的数字
推荐方法2,代码更短,容错性更好。
常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 截取出来的文字缺字或多字 | 中文字符和英文字符宽度不同,计数方式不一 | 统一转成字符串长度函数,或用正则替代 |
| split分割后列表索引越界 | 分隔符不存在或文本格式变了 | 先判断分割后的列表长度,或try-catch |
| 正则提取不到东西 | 表达式写错了 | 用正则测试工具(如regex101.com)验证 |
| JSON解析报错“Expecting value” | 返回的字符串不是合法JSON(可能是HTML或纯文本) | 先用print输出原始内容检查 |
| 提取手机号时匹配到40012345678(以4开头) | 正则写了1[3-9]但没限制首位 | 用 \b1[3-9]\d{9}\b 加单词边界 |
推荐资源
- 正则测试工具: regex101.com(选Python语法,可以实时测试)
- 影刀官方学院: “数据处理——字符串处理与正则表达式”(有案例视频)
- 我的文章联动:
- 下一篇预告:[影刀RPA进阶教程:Pandas在影刀中的常用操作——筛选/排序/合并/去重](选题池20号)
- 小技巧: 在影刀的“输出日志”里直接打印提取结果,确认拿到的数据对不对,再往下写流程
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
