在文本处理领域,正则表达式是开发者绕不开的工具。ref="/tag/2034/" style="color:#E3A3CF;font-weight:bold;">Perl 和 Python 都支持正则,但它们的使用方式和语法细节有不少差异。对于刚接触编程或从 Perl 转向 Python 的人来说,这些差别可能会带来一些困扰。
语法调用方式不同
Perl 把正则直接嵌入语言语法中,写起来非常简洁。比如匹配一个邮箱:
if ($text =~ /\w+@\w+\.\w+/) {
print "找到邮箱";
}
这里的 =~ 是 Perl 内建的操作符,正则直接写在斜杠之间,不需要额外导入模块。
而 Python 必须先导入 re 模块,再调用函数进行匹配:
import re
if re.search(r'\w+@\w+\.\w+', text):
print("找到邮箱")
虽然多了一步,但结构更清晰,适合不熟悉 Perl 语法的人理解。
默认行为有差异
Perl 的正则默认是区分大小写的,但可以通过修饰符改变。比如忽略大小写只需加个 i:
$text =~ /hello/i
Python 也支持忽略大小写,但需要显式传参:
re.search(r'hello', text, re.IGNORECASE)
另外,Python 的字符串前加 r 表示原始字符串,避免反斜杠被转义,这点在写复杂正则时特别重要。
捕获和分组的写法类似但调用不同
两者都用圆括号进行分组捕获。假设想提取日期中的年月日:
Perl 写法:
if ($date =~ /(\d{4})-(\d{2})-(\d{2})/) {
print "年: $1, 月: $2, 日: $3\n";
}
Python 中则要通过匹配对象获取:
match = re.search(r'(\d{4})-(\d{2})-(\d{2})', date)
if match:
print(f"年: {match.group(1)}, 月: {match.group(2)}, 日: {match.group(3)}")
Perl 直接用 $1、$2 引用捕获内容,写脚本时更顺手;Python 则更结构化,适合大型项目维护。
替换操作的实现方式
替换文本时,Perl 使用 s/// 语法:
$text =~ s/old/new/g;
加上 g 修饰符表示全局替换。简洁直观,常用于日志清洗或配置文件修改。
Python 用 re.sub() 函数完成相同任务:
new_text = re.sub(r'old', 'new', text)
如果要全局替换,函数本身就默认全部替换,不需要额外标记。
性能与适用场景
Perl 因为从诞生起就专注文本处理,正则引擎优化得非常好,处理大文件时响应更快。很多老派运维人员仍偏爱用 Perl 写日志分析脚本。
Python 虽然起步慢一点,但得益于清晰的语法和丰富的库支持,在数据清洗、网页爬虫等现代应用场景中更受欢迎。尤其是配合 re.compile() 编译正则后,重复使用效率也很高。
举个实际例子:你要批量重命名一堆照片文件,把 IMG_001.jpg 改成 Photo_1.jpg。用 Perl 可能三行搞定,而 Python 需要五六行代码,但后者更容易让同事看懂。