news 2026/9/8 19:50:05

还在用 Python 处理文本?Raku 正则 5 行代码搞定数据清洗,效率翻倍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
还在用 Python 处理文本?Raku 正则 5 行代码搞定数据清洗,效率翻倍

我们是由枫哥组建的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-DD2024/04/10(分隔符错误)

二、环境准备(2 分钟)

2.1 安装 Raku

# macOSbrewinstallrakudo# Ubuntu/Debiansudoapt-getinstallrakudo# 验证安装raku-v# This is Rakudo version 2024.06 built on MoarVM version 2024.06

2.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

维度RakuPythonShell (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后端校招算法学习
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/8 19:48:05

3 条命令自托管 1000+ 格式的文件转换服务:ConvertX 部署实践

3 条命令自托管 1000 格式的文件转换服务&#xff1a;ConvertX 部署实践 【免费下载链接】ConvertX &#x1f4be; Self-hosted online file converter. Supports 1000 formats ⚙️ 项目地址: https://gitcode.com/GitHub_Trending/co/ConvertX 不想把文件传到云端转换…

作者头像 李华
网站建设 2026/9/8 19:47:25

Claude越权访问事件复盘:Agent安全与权限控制的关键改进

Anthropic 前阵子公开复盘了一次 Claude 模型在真实测试中越权访问真实系统的事件。这份复盘报告我前后读了三遍&#xff0c;不夸张地说&#xff0c;这是最近一段时间我在 AI 安全领域看到的信息密度最高的一份文档——不是因为 Claude 犯了多严重的错&#xff0c;而是因为这次…

作者头像 李华
网站建设 2026/9/8 19:47:01

从安装到金手指:Atmosphère Switch 自制固件完整配置指南

从安装到金手指&#xff1a;Atmosphre Switch 自制固件完整配置指南 【免费下载链接】Atmosphere Atmosphre is a work-in-progress customized firmware for the Nintendo Switch. 项目地址: https://gitcode.com/GitHub_Trending/at/Atmosphere 一句话讲清 Atmosphre …

作者头像 李华
网站建设 2026/9/8 19:45:05

用代码图谱给Claude Code装上地图,工具调用量直降47%

最近把公司一套历史包袱很重的后端项目交给Claude Code处理跨模块重构&#xff0c;跑了两周下来最大的感受是&#xff1a;Claude Code本身不是不行&#xff0c;但它“找文件”的方式太原始了。一次稍微牵扯到几个模块的任务&#xff0c;它能连续调用几十次grep、glob和read&…

作者头像 李华
网站建设 2026/9/8 19:43:11

Claude Code 插件选型实战:9 款生产级工具与配置指南

做 Claude Code 插件选型这件事&#xff0c;我把自己当成小白鼠折腾了挺长时间。市面上打着“Claude Code 插件”旗号的东西五花八门&#xff0c;有的装上之后不但没提升效率&#xff0c;反而把上下文窗口塞得满满当当&#xff0c;代码审查做到一半就开始被截断&#xff0c;气得…

作者头像 李华