影刀RPA正则表达式实战:文本匹配、提取、替换全攻略
影刀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提供了专门的正则表达式指令组件:
操作步骤:
店群矩阵自动化突破运营极限!
- 在指令面板搜索 “正则” 或 “regex”
- 选择 「正则表达式匹配」 或 「正则表达式替换」
- 配置参数:
- 输入字符串:要处理的文本(可以是变量)
- 正则模式:你的正则表达式
- 全局匹配:是否查找所有匹配项(默认只找第一个)
示例:提取所有邮箱地址

输入变量: 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(不区分大小写)
注意: 仅做格式校验,不含合法性校验(校验位计算)

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:分割复杂分隔符的文本
原始: "苹果,香蕉;橙子|葡萄"
目标: 按逗号、分号、竖线分割

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开发者的瑞士军刀——小巧但功能强大。掌握了它,你在面对杂乱无章的文本数据时就有了化腐朽为神奇的能力。
核心要点回顾:
-
✅ 基础语法:
\d\w\s . *?+ {} []()— 这几个符号覆盖90%的场景 -
✅ 三种方式:内置指令 / Python re模块 / JavaScript — 按需选择
-
✅ 10个场景:手机号、邮箱、金额、身份证、日期、URL、HTML清理、分割、去空格、密码校验
-
✅ 调试工具:regex101.com 是你的好朋友
-

-
✅ 性能优化:预编译、非贪婪、避免回溯灾难
-
✅ 实战案例:商品标题解析器 — 一个正则解决多个字段提取
一句话总结: 学会正则表达式,你的RPA数据处理能力直接翻倍。花两天时间把基础语法练熟,后面就是不断积累自己的「正则工具箱」了。
📖 相关文章推荐
- 影刀RPA新手入门完全指南 — 零基础入门必读
- 影刀RPA数据采集实战:循环+Excel写入完整案例 — 正则配合采集更强大
- 影刀RPA变量与数据类型详解 — 字符串操作的更多技巧
- 影刀RPA Excel操作完全指南 — 数据清洗后写入Excel
💡 觉得有帮助? 点赞收藏 + 关注我,持续分享影刀RPA实用技巧!有任何问题欢迎评论区留言交流 🙋♂️
更多推荐





所有评论(0)