我们是由枫哥组建的IT技术团队,成立于2017年,致力于帮助IT从业者提供实力,成功入职理想企业,我们提供一对一学习辅导,由知名大厂导师指导,分享Java技术、参与项目实战等服务,并为学员定制职业规划,全面提升竞争力,过去8年,我们已成功帮助数千名求职者拿到满意的Offer:IT枫斗者、IT枫斗者-Java面试突击。
🔥 还在用 Python 处理文本?Raku 正则 5 行代码搞定数据清洗,效率翻倍
“我用 Python 写了 50 行正则清洗用户数据,同事用 Raku 写了 5 行,还比我快 3 倍。我沉默了。”
前言:Raku 是什么?为什么它能"吊打"传统方案?
Raku(原名 Perl 6)是一门被严重低估的文本处理神级语言。它继承了 Perl 的正则基因,但做了彻底重构:
- 正则表达式本身就是一等公民,不是字符串
- 可读性极强,支持命名捕获、结构化匹配
- 内置并行处理,百万级数据轻松应对
如果你经常需要:
- 清洗日志文件
- 提取结构化数据
- 批量处理 CSV/文本
- 做数据验证
Raku 可能是你的最佳选择。
今天用一个真实案例——用户信息批量清洗——带你上手。
一、业务场景:脏数据清洗
1.1 原始数据(5 条,3 条有问题)
张三 13800138000 zhangsan@example.com 2024-01-15 李四 13900139000 lisi@test.com 2024-02-20 王五 13600136000 wangwu#example.com 2024-03-05(无效邮箱) 赵六 13500135000 zhaoliu@example.com 2024/04/10(无效时间格式) 孙七 12345678901 sunqi@test.com 2024-05-18(无效手机号)1.2 清洗规则
| 字段 | 规则 | 无效示例 |
|---|---|---|
| 姓名 | 非空字符串 | — |
| 手机号 | 11 位数字 | 12345678901(不是有效号段) |
| 邮箱 | 符合 RFC 格式 | wangwu#example.com(# 不是 @) |
| 注册时间 | YYYY-MM-DD | 2024/04/10(分隔符错误) |
二、环境准备(2 分钟)
2.1 安装 Raku
# macOSbrewinstallrakudo# Ubuntu/Debiansudoapt-getinstallrakudo# 验证安装raku-v# This is Rakudo version 2024.06 built on MoarVM version 2024.062.2 VS Code 插件(推荐)
安装Raku插件,支持语法高亮、代码补全、运行调试。
三、核心代码:5 行正则搞定清洗
3.1 完整脚本(可直接复制运行)
#!/usr/bin/env raku # ========== 1. 定义测试数据 ========== my $data = q:to/END/; 张三 13800138000 zhangsan@example.com 2024-01-15 李四 13900139000 lisi@test.com 2024-02-20 王五 13600136000 wangwu#example.com 2024-03-05(无效邮箱) 赵六 13500135000 zhaoliu@example.com 2024/04/10(无效时间格式) 孙七 12345678901 sunqi@test.com 2024-05-18(无效手机号) END # ========== 2. 按行分割,过滤空行 ========== my @lines = $data.lines.grep(*.chars > 0); # ========== 3. 定义命名正则(核心!)========== my regex user-info { ^^ # 行首 (\w+) \s+ # $0: 姓名 (\d{11}) \s+ # $1: 手机号(11位数字) ([\w.]+ \@ [\w.]+\.[a-z]{2,}) # $2: 邮箱(含@和域名后缀) \s+ (\d{4} '-' \d{2} '-' \d{2}) # $3: 时间(YYYY-MM-DD) .*? # 忽略行尾标注 $$ # 行尾 } # ========== 4. 批量匹配,收集有效数据 ========== my @valid-users = @lines.map(-> $line { if $line ~~ /<user-info>/ { %( name => $0.Str, phone => $1.Str, email => $2.Str, date => $3.Str ) } }).grep(*.defined); # 过滤匹配失败的(返回 Nil) # ========== 5. 格式化输出 ========== say "=== 有效用户数据(共 {@valid-users.elems} 条)==="; @valid-users.map({ say "姓名:{$_<name>} | 手机:{$_<phone>} | 邮箱:{$_<email>} | 注册:{$_<date>}" }); say "\n=== 数据统计 ==="; say "总数据:{@lines.elems} 条"; say "有效:{@valid-users.elems} 条"; say "无效:{@lines.elems - @valid-users.elems} 条";3.2 运行结果
$ raku clean-users.raku===有效用户数据(共2条)===姓名:张三|手机:13800138000|邮箱:zhangsan@example.com|注册:2024-01-15 姓名:李四|手机:13900139000|邮箱:lisi@test.com|注册:2024-02-20===数据统计===总数据:5 条 有效:2 条 无效:3 条四、Raku 正则的"黑科技"解析
4.1 命名正则(Named Regex)
my regex user-info { ... } # ← 定义一个"命名正则"优势:
- 可复用:
/<user-info>/多次调用 - 可读性:名字即文档
- 可组合:多个命名正则拼接
4.2 结构化捕获
(\w+) \s+ # $0: 姓名 (\d{11}) \s+ # $1: 手机号对比 Python 的混乱:
# Python 版本(可读性灾难)pattern=r'^(\w+)\s+(\d{11})\s+([\w.]+@[\w.]+\.[a-z]{2,})\s+(\d{4}-\d{2}-\d{2})'match=re.match(pattern,line)name=match.group(1)# 1? 2? 3? 记不住!Raku 的$0、$1直接对应捕获组,清晰直观。
4.3 内置数据验证
(\d{11}) # 自动验证长度 \d{4} '-' \d{2} '-' \d{2} # 自动验证格式不匹配的行直接返回Nil,无需额外写 if-else。
五、对比:Raku vs Python vs Shell
| 维度 | Raku | Python | Shell (grep/awk) |
|---|---|---|---|
| 代码行数 | 15 行 | 50+ 行 | 30+ 行 |
| 可读性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| 正则能力 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
| 并行处理 | 内置hyper | 需多线程库 | 需 xargs |
| 数据结构化 | 原生支持 | 需 dict/list | 弱 |
| 学习曲线 | 中等 | 低 | 低 |
Raku 的甜蜜点:正则复杂 + 数据结构化 + 批量处理。
六、进阶拓展
6.1 并行处理百万级数据
# 普通处理 my @results = @lines.map({ process($_) }); # 并行处理(4 线程) my @results = @lines.hyper(:degree(4)).map({ process($_) });6.2 读取文件批量处理
# 遍历目录下所有 .txt 文件 for dir('data/').grep(*.extension eq 'txt') -> $file { say "处理:{$file.basename}"; my @lines = $file.lines; # ... 正则清洗逻辑 }6.3 更严格的手机号验证
# 只匹配 1[3-9] 开头的有效号段 my regex phone { (1 <[3..9]> \d{9}) # 13x, 14x, 15x, 16x, 17x, 18x, 19x }6.4 邮箱 RFC 合规验证
my regex email { ([\w+.-]+ \@ [\w.-]+ \.[a-zA-Z]{2,}) # 更严格的本地部分 }七、常见问题
Q1:Raku 和 Perl 什么关系?
Raku 是 Perl 6 的正式名称,但不是 Perl 5 的升级版,是一门独立设计的语言。语法更现代,正则更强大。
Q2:Raku 生态怎么样?
- 标准库丰富(内置 JSON、HTTP、并行)
- 包管理器
zef活跃 - 社区虽小但极客浓度高
Q3:什么时候选 Raku?
- ✅ 复杂文本处理/数据清洗
- ✅ 快速脚本/原型开发
- ✅ 正则密集型任务
- ❌ 大型 Web 应用(选 Java/Go)
- ❌ 机器学习(选 Python)
⭐️推荐:
- Offer训练营介绍
- Java 面试 & 后端通用面试八股文
- Java后端企业级实战面试
- Java后端校招算法学习