
我们是由枫哥组建的IT技术团队成立于2017年致力于帮助IT从业者提供实力成功入职理想企业我们提供一对一学习辅导由知名大厂导师指导分享Java技术、参与项目实战等服务并为学员定制职业规划全面提升竞争力过去8年我们已成功帮助数千名求职者拿到满意的OfferIT枫斗者、IT枫斗者-Java面试突击。 还在用 Python 处理文本Raku 正则 5 行代码搞定数据清洗效率翻倍“我用 Python 写了 50 行正则清洗用户数据同事用 Raku 写了 5 行还比我快 3 倍。我沉默了。”前言Raku 是什么为什么它能吊打传统方案Raku原名 Perl 6是一门被严重低估的文本处理神级语言。它继承了 Perl 的正则基因但做了彻底重构正则表达式本身就是一等公民不是字符串可读性极强支持命名捕获、结构化匹配内置并行处理百万级数据轻松应对如果你经常需要清洗日志文件提取结构化数据批量处理 CSV/文本做数据验证Raku 可能是你的最佳选择。今天用一个真实案例——用户信息批量清洗——带你上手。一、业务场景脏数据清洗1.1 原始数据5 条3 条有问题张三 13800138000 zhangsanexample.com 2024-01-15 李四 13900139000 lisitest.com 2024-02-20 王五 13600136000 wangwu#example.com 2024-03-05无效邮箱 赵六 13500135000 zhaoliuexample.com 2024/04/10无效时间格式 孙七 12345678901 sunqitest.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.062.2 VS Code 插件推荐安装Raku插件支持语法高亮、代码补全、运行调试。三、核心代码5 行正则搞定清洗3.1 完整脚本可直接复制运行#!/usr/bin/env raku # 1. 定义测试数据 my $data q:to/END/; 张三 13800138000 zhangsanexample.com 2024-01-15 李四 13900139000 lisitest.com 2024-02-20 王五 13600136000 wangwu#example.com 2024-03-05无效邮箱 赵六 13500135000 zhaoliuexample.com 2024/04/10无效时间格式 孙七 12345678901 sunqitest.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|邮箱zhangsanexample.com|注册2024-01-15 姓名李四|手机13900139000|邮箱lisitest.com|注册2024-02-20数据统计总数据5 条 有效2 条 无效3 条四、Raku 正则的黑科技解析4.1 命名正则Named Regexmy regex user-info { ... } # ← 定义一个命名正则优势可复用/user-info/多次调用可读性名字即文档可组合多个命名正则拼接4.2 结构化捕获(\w) \s # $0: 姓名 (\d{11}) \s # $1: 手机号对比 Python 的混乱# Python 版本可读性灾难patternr^(\w)\s(\d{11})\s([\w.][\w.]\.[a-z]{2,})\s(\d{4}-\d{2}-\d{2})matchre.match(pattern,line)namematch.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,}) # 更严格的本地部分 }七、常见问题Q1Raku 和 Perl 什么关系Raku 是 Perl 6 的正式名称但不是 Perl 5 的升级版是一门独立设计的语言。语法更现代正则更强大。Q2Raku 生态怎么样标准库丰富内置 JSON、HTTP、并行包管理器zef活跃社区虽小但极客浓度高Q3什么时候选 Raku✅ 复杂文本处理/数据清洗✅ 快速脚本/原型开发✅ 正则密集型任务❌ 大型 Web 应用选 Java/Go❌ 机器学习选 Python⭐️推荐:Offer训练营介绍Java 面试 后端通用面试八股文Java后端企业级实战面试Java后端校招算法学习