Perl正则和Python区别:别再混淆了

出门旅行订票,总免不了填各种表单。有时候要验证邮箱,有时候要提取航班号,写脚本处理这些信息时,正则表达式就成了常用工具。可当你翻教程发现一会儿是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单行命令清理服务器日志,别惊讶,那是人家练出来的手感。

学正则本身才是关键。模式语法基本通用,真正差别在于怎么调用、怎么取结果、怎么嵌入流程。搞明白这一点,切换语言时心里就有底了。