影刀RPA正则表达式实战:文本匹配、提取、替换全攻略

作者: 林焱 | 阅读时间: 约12分钟 | 难度: ⭐⭐⭐ 中级

SEO关键词: 影刀RPA正则表达式、正则表达式教程、RPA文本处理、正则匹配提取替换


一、为什么RPA开发者必须掌握正则表达式?

在实际的RPA开发中,你一定遇到过这样的场景:

  • 从一大段HTML里提取出所有手机号码
  • 从混乱的商品名称中分离品牌和型号
  • 把"2026/06/09"、“2026.6.9”、"2026年6月9日"统一格式化为标准日期
  • 判断一个字符串是否是合法的邮箱地址
  • 从日志文件中筛选包含特定模式的错误信息

如果不用正则表达式,你可能需要写几十行字符串截取、拼接、判断的代码。而用正则,一行就能搞定。

在影刀RPA中,正则表达式的应用场景非常广泛:

场景 示例
数据清洗 提取价格中的数字(“¥1,299.00” → 1299)
网页采集 从HTML源码中匹配特定内容
文件处理 批量重命名时按规则生成新名称
在这里插入图片描述

| 日志分析 | 从运行日志中提取错误码和堆栈信息 |
| 表单验证 | 校验用户输入的手机号、身份证号等格式 |
| 报告生成 | 将原始数据按模板格式化输出 |

本文将从零开始,手把手教你掌握正则表达式在影刀RPA中的实战用法。


二、正则表达式基础语法速查表

2.1 基本字符匹配

普通字符    匹配自身          "hello" 匹配 "hello"
.           匹配任意单个字符  "h.llo" 匹配 "hallo", "h@llo", "h1llo"
\d          匹配任意数字      "\d{11}" 匹配11位手机号
\D          匹配非数字字符
\w          匹配字母、数字、下划线
\W          匹非单词字符
\s          匹配空白符(空格、制表、换行)
\S          匹配非空白符

2.2 量词(控制匹配次数)

*       前面的元素出现0次或多次     "ab*c" 匹配 "ac", "abc", "abbc"
+       前面的元素出现1次或多次     "ab+c" 匹配 "abc", "abbc",不匹配 "ac"
?       前面的元素出现0次或1次      "colou?r" 匹配 "color", "colour"
{n}     恰好出现n次               "\d{4}" 匹配4位数字(年份)
{n,m}   出现n到m次                "\d{3,5}" 匹配3-5位数字
{n,}    出现n次及以上              "\d{8,}" 匹配8位及以上数字

2.3 字符集与分组

[abc]       匹配a、b、c中的任意一个
[a-z]       匹配a到z的所有小写字母
[^abc]      匹配除a、b、c之外的任意字符
(abc)       分组,将abc作为一个整体捕获
(?:abc)     非捕获分组,不保存匹配结果
|           或运算符             "cat|dog" 匹配 "cat" 或 "dog"

2.4 锚点与边界

在这里插入图片描述

^       行首锚点        "^Hello" 只匹配以Hello开头的行
$       行尾锚点        "world$" 只匹配以world结尾的行
\b      单词边界        "\btest\b" 只匹配独立的单词test
\B      非单词边界

💡 记忆技巧: ^$就像一把尺子的两端——^从左边卡住开头,$从右边卡住结尾。\b像一个隐形的空格,标记单词的边缘。


三、影刀RPA中使用正则表达式的三种方式

方式一:使用内置「正则表达式」指令

影刀RPA提供了专门的正则表达式指令组件:

操作步骤:

店群矩阵自动化突破运营极限!

  1. 在指令面板搜索 “正则”“regex”
  2. 选择 「正则表达式匹配」「正则表达式替换」
  3. 配置参数:
    • 输入字符串:要处理的文本(可以是变量)
    • 正则模式:你的正则表达式
    • 全局匹配:是否查找所有匹配项(默认只找第一个)

示例:提取所有邮箱地址

在这里插入图片描述

输入变量:  pageText (网页中的文本)
正则模式:  \w+@\w+\.\w+(?:\.\w+)?
输出变量:  emailList (匹配结果列表)

方式二:使用Python代码块执行正则

对于复杂的正则操作,推荐使用代码块:

import re

text = $输入文本$

# --- 场景1: 提取所有手机号 ---
phones = re.findall(r'1[3-9]\d{9}', text)
print(f"找到 {len(phones)} 个手机号: {phones}")

# --- 场景2: 提取价格 ---
prices = re.findall(r'¥[\d,]+\.?\d*', text)
clean_prices = [p.replace('¥', '').replace(',', '') for p in prices]
print(f"找到 {len(clean_prices)} 个价格: {clean_prices}")

# --- 场景3: 替换日期格式 ---
# 统一将各种日期格式转为 YYYY-MM-DD
new_text = re.sub(
    r'(\d{4})[/\.年](\d{1,2})[/\.月](\d{1,2})日?',
    r'\1-\2-\3',
    text
)
$输出文本$ = new_text

方式三:使用JavaScript代码块

var text = $输入文本$;
var pattern = /1[3-9]\d{9}/g;  // g 表示全局匹配
var results = text.match(pattern);
if (results) {
    $结果$ = results.join(',');
} else {
    $结果$ = '';
}

🎯 推荐策略: 简单的正则用内置指令;复杂逻辑用 Python 代码块(re库功能最全);需要快速测试用 JavaScript。


四、10个高频实战场景(附可直接使用的正则)

场景1:提取中国手机号

在这里插入图片描述

正则:  1[3-9]\d{9}
说明:  以1开头,第二位3-9,共11位数字
示例:  "我的电话是13812345678,备用13987654321"
结果:  ['13812345678', '13987654321']
import re
text = "联系张经理13812345678,或者李总13987654321"
phones = re.findall(r'1[3-9]\d{9}', text)
# 结果: ['13812345678', '13987654321']

场景2:提取邮箱地址

正则:  [\w.-]+@[\w-]+\.[\w.]+
说明:  匹配常见邮箱格式
注意:  完美匹配邮箱的正则极其复杂,这个覆盖99%日常使用
emails = re.findall(r'[\w.-]+@[\w-]+\.\w+', text)
# "联系support@example.com或admin@test.org.cn"
# 结果: ['support@example.com', 'admin@test.org.cn']

场景3:提取金额(支持多种货币符号)

正则:  [¥¥$]\s*[\d,]+\.?\d*
说明:  匹配 ¥、¥、$ 开头的金额,允许千分位逗号
price_pattern = r'[¥¥$]\s*([\d,]+\.?\d*)'
prices = re.findall(price_pattern, "总价¥1,299.00,优惠后¥999")
# 清理结果:
prices_clean = [p.replace(',', '') for p in prices]
# ['1299.00', '999']

场景4:提取身份证号(18位)

正则:  \d{17}[\dXx]
说明:  17位数字 + 最后一位数字或X(不区分大小写)
注意:  仅做格式校验,不含合法性校验(校验位计算)
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/63d375db6e3a4bfb93925480f4e09631.png#pic_center)

id_numbers = re.findall(r'\d{17}[\dXx]', text)

场景5:统一日期格式

原始:  "订单日期2026/06/09,发货2026.7.10,到期2026年8月15日"
目标:  全部转为 2026-06-09 格式
def normalize_date(text):
    # 匹配 2026/06/09 或 2026.6.9 或 2026年6月9日
    pattern = r'(\d{4})[/\.年](\d{1,2})[/\.月](\d{1,2})日?'
    result = re.sub(pattern, lambda m: f"{m.group(1)}-{int(m.group(2)):02d}-{int(m.group(3)):02d}", text)
    return result

text = "订单日期2026/06/09,发货2026.7.10,到期2026年8月15日"
print(normalize_date(text))
# 输出: "订单日期2026-06-09,发货2026-07-10,到期2026-08-15"

场景6:从URL提取域名

正则:  https?://([^/\s]+)
说明:  提取http(s)://后面的域名部分
urls = re.findall(r'https?://([^/\s]+)', page_html)
# "访问https://www.example.com/page 和 http://baidu.com"
# 结果: ['www.example.com', 'baidu.com']

场景7:从HTML提取纯文本

from html import unescape
import re

html_content = '<div class="price">¥<span>1299</span>.00</div>'
# 去除HTML标签
plain_text = re.sub(r'<[^>]+>', '', html_text)
plain_text = unescape(plain_text)
# 结果: "¥1299.00"

场景8:分割复杂分隔符的文本

原始:  "苹果,香蕉;橙子|葡萄"
目标:  按逗号、分号、竖线分割
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9d23e17e5c2242c3b153aa50213bfeda.png#pic_center)

items = re.split(r'[;,|]', "苹果,香蕉;橙子|葡萄")
# 结果: ['苹果', '香蕉', '橙子', '葡萄']

场景9:去除多余空格和空白行

def clean_whitespace(text):
    # 多个空格合并为一个
    text = re.sub(r' +', ' ', text)
    # 多个换行合并为两个(保留段落间隔)
    text = re.sub(r'\n\s*\n+', '\n\n', text)
    # 去除首尾空白
    text = text.strip()
    return text

场景10:验证密码强度

def check_password_strength(pwd):
    """返回密码强度等级和提示"""
    if len(pwd) < 8:
        return "弱 - 密码长度至少8位"

    score = 0
    if re.search(r'[a-z]', pwd): score += 1  # 小写字母
    if re.search(r'[A-Z]', pwd): score += 1  # 大写字母
    if re.search(r'\d', pwd): score += 1     # 数字
    if re.search(r'[^a-zA-Z\d]', pwd): score += 1  # 特殊字符

    levels = {1: "弱", 2: "中等", 3: "强", 4: "极强"}
    tips = {
        1: "建议混合大小写字母、数字和特殊符号",
        2: "可以加入大写字母或特殊字符",
        3: "密码强度不错",
        4: "密码非常安全!"
    }
    return f"{levels[score]} - {tips[score]}"

五、正则表达式调试神器

写正则最痛苦的是什么?写出来不对,又不知道哪里错了。

推荐以下工具,能大幅提升效率:

工具 地址 特点
regex101 regex101.com 最全面,支持实时高亮、详细解释、多语言兼容性检查
RegExr regexr.com 可视化好,社区分享常用正则
在线正则测试 tool.lu/regex 国内访问快,中文界面

调试流程(推荐)

在这里插入图片描述

1. 先在 regex101.com 中编写和测试正则
2. 用真实的样本数据验证每个匹配结果
3. 确认无误后复制到影刀RPA代码块中使用
4. 在影刀中加入 try-except 包裹,防止异常崩溃

六、性能优化:让正则跑得更快

当需要处理大量文本时,正则的性能至关重要。

6.1 避免回溯灾难

# ❌ 危险!指数级回溯
bad_pattern = r'(a+)+b'

# ✅ 安全写法
good_pattern = r'a+b'

6.2 使用非贪婪匹配

temu店群自动化报活动案例

# ❌ 贪婪匹配(可能匹配过多内容)
re.findall(r'<div.*>', html)

# ✅ 非贪婪(遇到第一个 > 就停止)
re.findall(r'<div.*?>', html)

6.3 预编译正则(多次复用时)

在这里插入图片描述

# 如果同一个正则要重复使用几百上千次,预编译能提升30%-50%速度
PHONE_PATTERN = re.compile(r'1[3-9]\d{9}')
PRICE_PATTERN = re.compile(r'[¥¥$]\s*([\d,]+\.?\d*)')

# 后续直接使用:
phones = PHONE_PATTERN.findall(large_text)
prices = PRICE_PATTERN.findall(large_text)

6.4 用字符串方法替代简单正则

# 简单的前缀/后缀匹配,不要用正则
# ❌
re.match('^Hello', text)

# ✅ 更快
text.startswith('Hello')

七、完整实战案例:电商商品信息智能解析器

假设你需要从电商平台抓取到的原始商品标题中,结构化提取品牌、型号、规格、颜色等信息。

import re
import json

def parse_product_title(title):
    """
    解析商品标题,提取结构化信息
    输入: "Apple iPhone 16 Pro Max 256GB 深空黑色 5G全网通"
    输出: {"brand": "Apple", "model": "iPhone 16 Pro Max", ...}
    """
    result = {
        "brand": "",
        "model": "",
        "storage": "",
        "color": "",
        "network": ""
    }

    # 常见品牌关键词
    brand_pattern = r'(Apple|苹果|华为|HUAWEI|小米|Xiaomi|OPPO|vivo|三星|Samsung)'
    brand_match = re.search(brand_pattern, title, re.IGNORECASE)
    if brand_match:
        result["brand"] = brand_match.group(1)

    # 存储容量
    storage_pattern = r'(\d+)\s*(GB|TB|G|T)(\s*\+\s*(\d+)\s*(GB|TB|G|T))?'
    storage_match = re.search(storage_pattern, title, re.IGNORECASE)
    if storage_match:
        result["storage"] = storage_match.group(0).strip()

    # 网络类型
    network_pattern = r'(5G|4G|全网通|双卡双待|WiFi版)'
    network_match = re.search(network_pattern, title)
    if network_match:
        result["network"] = network_match.group(1)

    # 颜色(常见颜色词)
    color_pattern = r'(黑色|白色|金色|银色|蓝色|红色|绿色|紫色|深空黑|星光白|远峰蓝)'
    color_match = re.search(color_pattern, title)
    if color_match:
        result["color"] = color_match.group(1)

    # 型号(品牌之后的内容,去掉后面的规格描述)
    if result["brand"]:
        model_part = title[len(result["brand"]):].strip()
        # 去掉容量、颜色、网络类型的文字
        model_part = re.sub(result["storage"], '', model_part)
        model_part = re.sub(result["color"], '', model_part)
        model_part = re.sub(result["network"], '', model_part)
        result["model"] = model_part.strip()

    return result

# 测试
titles = [
    "Apple iPhone 16 Pro Max 256GB 深空黑色 5G全网通",
    "华为 Mate60 Pro 512GB 雅川青 双卡双待",
    "小米14 Ultra 16GB+1TB 白色 5G",
]

for t in titles:
    print(json.dumps(parse_product_title(t), ensure_ascii=False, indent=2))
    print("-" * 40)

输出结果:

{
  "brand": "Apple",
  "model": "iPhone 16 Pro Max",
  "storage": "256GB",
  "color": "深空黑色",
  "network": "5G全网通"
}
--------------------------------------------------
{
  "brand": "华为",
  "model": "Mate60 Pro",
  "storage": "512GB",
  "color": "雅川青",
  "network": "双卡双待"
}
--------------------------------------------------
{
  "brand": "小米",
  "model": "14 Ultra",
  "storage": "16GB+1TB",
  "color": "白色",
  "network": "5G"
}

在这里插入图片描述

八、常见陷阱与避坑指南

陷阱 问题 解决方案
忘记转义特殊字符 \.写成.会匹配任意字符 使用 raw string: r'\.'
贪婪匹配过头 .*匹配了太多内容 ?变成非贪婪: .*?
中文字符编码问题 中文正则在某些环境下异常 确保 UTF-8 编码
回溯导致超时 复杂嵌套量词 简化正则结构
忽略大小写 手机号有大小写?不会但其他场景可能 re.IGNORECASE标志
多行模式 ^$默认匹配整个字符串 re.MULTILINE逐行匹配

九、学习路线图

第1周:  掌握基本语法(\d \w \s . * ? + {} [] () |)
        → 能写出简单的手机号/邮箱匹配正则

第2周:  学会分组和引用 (\1 \2 ...)
        → 能做简单的文本替换和数据提取

第3周:  掌握前瞻/后顾 (?=...) (?!...)
        → 能做复杂的条件匹配

第4周:  结合影刀RPA实际项目练习
        → 能独立解决80%的数据清洗需求

进阶:   学习正则引擎原理(NFA/DFA)
        → 能写出高性能正则,避免回溯灾难

十、总结

正则表达式是RPA开发者的瑞士军刀——小巧但功能强大。掌握了它,你在面对杂乱无章的文本数据时就有了化腐朽为神奇的能力。

核心要点回顾:

  1. 基础语法\d\w\s . *?+ {} []() — 这几个符号覆盖90%的场景

  2. 三种方式:内置指令 / Python re模块 / JavaScript — 按需选择

  3. 10个场景:手机号、邮箱、金额、身份证、日期、URL、HTML清理、分割、去空格、密码校验

  4. 调试工具:regex101.com 是你的好朋友

  5. 在这里插入图片描述

  6. 性能优化:预编译、非贪婪、避免回溯灾难

  7. 实战案例:商品标题解析器 — 一个正则解决多个字段提取

一句话总结: 学会正则表达式,你的RPA数据处理能力直接翻倍。花两天时间把基础语法练熟,后面就是不断积累自己的「正则工具箱」了。


📖 相关文章推荐


💡 觉得有帮助? 点赞收藏 + 关注我,持续分享影刀RPA实用技巧!有任何问题欢迎评论区留言交流 🙋‍♂️

更多推荐