出门旅行订票,总免不了填各种表单。有时候要验证邮箱,有时候要提取航班号,写脚本处理这些信息时,正则表达式就成了常用工具。可当你翻教程发现一会儿是ref="/tag/2034/" style="color:#C468A7;font-weight:bold;">Perl的写法,一会儿又是Python的,容易懵。其实这两者在正则的用法上还真有不少差别。
语法层面:写法看着像,细节不一样
Perl天生就为文本处理而生,正则直接嵌在语言里。比如你想从一段文字里找出邮箱,Perl可以这么写:
$text = "Contact: user@example.com";
if ($text =~ /([\w.-]+@[\w.-]+)/) {
print "Found: $1\n";
}
这里的 =~ 是匹配操作符,斜杠包裹正则,变量 $1 直接拿捕获内容,简洁顺手。
换成Python,就得导入 re 模块,调用方法来干活:
import re
text = "Contact: user@example.com"
match = re.search(r'([\w.-]+@[\w.-]+)', text)
if match:
print("Found:", match.group(1))
虽然正则模式长得差不多,但Python得先调函数,再判断结果对象是否存在,步骤多了一点。
默认行为不同:是否自动启用正则变量
Perl有个贴心设计,只要一次匹配成功,捕获的内容会自动存进 $1、$2 这类变量里,后续随便用。Python没这功能,必须通过 match.group() 显式取值。
比如你在整理一堆火车票订单,想批量提取出发站和到达站:
# Perl 写法
$line = "From: Beijing To: Shanghai";
if ($line =~ /From: (\w+) To: (\w+)/) {
print "出发地: $1, 到达地: $2\n";
}
# Python 写法
import re
line = "From: Beijing To: Shanghai"
match = re.search(r'From: (\w+) To: (\w+)', line)
if match:
print(f"出发地: {match.group(1)}, 到达地: {match.group(2)}")
看起来只是写法差异,但在快速写个小脚本时,Perl的紧凑确实省事些。
修饰符写法也不同
不区分大小写查找?Perl用 /i 放在末尾:
$text =~ /beijing/i
Python则要在参数里加标志:
re.search(r'beijing', text, re.IGNORECASE)
或者提前编译模式:
pattern = re.compile(r'beijing', re.IGNORECASE)
各有习惯,但Python更显式,读起来逻辑清楚。
实际用哪个?看场景
现在写自动化脚本,大多数人还是选Python。库多、好读、维护方便。虽然正则写起来比Perl啰嗦一点,但胜在生态强大。比如你用Python还能顺手把提取的数据存进Excel,发邮件通知自己,一气呵成。
Perl也不是没用武之地。老系统里不少运维脚本是Perl写的,尤其是日志分析这类任务,一行命令搞定的情况 still 存在。如果你看到同事甩出一条带正则的Perl单行命令清理服务器日志,别惊讶,那是人家练出来的手感。
学正则本身才是关键。模式语法基本通用,真正差别在于怎么调用、怎么取结果、怎么嵌入流程。搞明白这一点,切换语言时心里就有底了。