文档备案控制台
免费开始使用

影刀RPA新手教程:从文本中提取数据的4种方法——正则/split/截取/JSON解析

采集到的原始数据经常是“价格:¥99.00元”这种混合文本,或者是一大段JSON返回包。
你只想要里面的数字“99.00”,或者某个字段的值——这就需要从文本中提取。

影刀里提取数据有4种常用方法: 截取、split分割、正则提取、JSON解析。
我按难度和适用场景排个序,新手从截取开始学,后面慢慢过渡到正则。


一、截取:固定位置取子串(最简单)

适用场景

  • 文本格式完全固定,比如 "商品ID:123456789",ID永远是9位数字
  • 想取第3个字符到第8个字符

指令位置

文本处理 → 截取字符串

picture.image

参数设置

  • 原始文本:要处理的字符串变量

picture.image

  • 开始位置:从第几个字符开始(从0开始数)
  • 字符长度:截取多少位

实战:取固定长度的订单号

原始文本:"订单号:2024101500012345"

picture.image 想取后面的16位数字。

原始文本 = "订单号:2024101500012345"
# “订单号:”占4个中文字符(注意:中文算1个字符)

![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/19664b03e1b343dab75c0fc46e2f460b~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1782347427&x-signature=8TYdajFCQFRXvfr49JMnEB%2F4Mtw%3D)
订单号 = 截取字符串(原始文本, 4, 16)
# 结果:"2024101500012345"

限制

picture.image 只能处理位置和长度都固定的场景。
一旦数字长度变化(比如有时15位有时16位),截取就会出错——这时候要用正则。

picture.image

picture.image

二、Split分割:按分隔符拆成数组

适用场景

  • 文本有明确的分隔符,比如 "苹果,香蕉,橙子"(逗号分隔)
  • 想取分隔符前后的某一段

指令位置

文本处理 → 分割字符串

参数设置

  • 原始文本:待分割的字符串
  • 分隔符:比如 ",""|"":"
  • 输出到列表:新建一个列表变量

实战:提取“价格:99”中的数字

原始文本 = "价格:99"
# 按冒号分割
分割后列表 = 分割字符串(原始文本, ":")
# 结果:["价格", "99"]
价格 = 分割后列表[1]   # 取第二个元素,结果是"99"

实战:处理CSV格式的一行数据

一行Excel数据:"手机,1999,100件"


![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/cc8071844f7a4218aa6f82cd6464eb3a~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1782347427&x-signature=Gwdhfnb994UjkFJFB%2F3cHWrKVYE%3D)
行数据列表 = 分割字符串("手机,1999,100件", ",")
商品名 = 行数据列表[0]   # "手机"
价格 = 行数据列表[1]     # "1999"

进阶:多个分隔符连续处理

先按一个分隔符分割,再对结果用另一个分隔符分割。
比如 "姓名:张三|年龄:25",想取年龄值。

第一步分割 = 分割字符串(原始文本, "|")   # 得到 ["姓名:张三", "年龄:25"]
年龄部分 = 第一步分割[1]                 # "年龄:25"
年龄值 = 分割字符串(年龄部分, ":")[1]    # "25"

三、正则提取:最强大,学习曲线稍陡

适用场景

  • 提取手机号、邮箱、价格数字、日期等有规律但不固定位置的内容
  • 文本里有多种干扰字符,但模式固定

指令位置

文本处理 → 正则提取(影刀内置指令,部分版本在“Python代码”里需要手写)

常用正则模式速查

picture.image

picture.image

要提取的内容正则表达式示例
纯数字(整数)\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返回)

选择流程:

  1. 格式完全固定(位置和长度都知道)→ 截取
  2. 有明确分隔符(逗号、冒号、竖线)→ split
  3. 有规律但混杂其他字符(价格、手机号)→ 正则
  4. 是标准的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学习手册》系列文章之一,内容源于实操经验的整理与分享。

0
0
0
0
评论
未登录
暂无评论