python - 正则表达式在 python 模拟器中有效,但在 perl 中无效

标签 python regex perl

您好,我正在使用在线正则表达式模拟器来测试我所写的内容是否正确: 我想从以下文本中提取信息:

Test23242asdsa 800,03 23.05.19 22.05.19
Tdsadas,tsadsa test 1.020,03 23.05.19 22.05.19
Test,23242 0,03 23.05.19 22.05.19

我尝试在 perl 中使用相同的代码:

use strict;
my $entry = 'Test23242asdsa 0,03 23.05.19 22.05.19';
my ($name, $expense, $date_expense, $date_paid) = $1, $2, $3, $4 if ($entry =~ m/^(.+)\s((?:\d+\.)?\d{1,3},\d{2})\s(\d{2}\.\d{2}\.\d{2})\s(\d{2}\.\d{2}\.\d{2})$/);
print "Name: '$name', Expense: '$expense', Date: '$date_expense', Date Paid: '$date_paid' \n";

如果我在这里使用相同的正则表达式:

https://regex101.com/
^(.+)\s((?:\d+\.)?\d{1,3},\d{2})\s(\d{2}\.\d{2}\.\d{2})\s(\d{2}\.\d{2}\.\d{2})$

它可以正确检测 de regex。我虽然 python 和 perl 使用相同的正则表达式语法,所以我不明白发生了什么。

最佳答案

正则表达式没问题,问题在于你如何设置变量。

由于 Perl 的运算符优先级,您需要将 $1, $2, $3, $4 括在括号中才能进行列表赋值。

更改为

my ($name, $expense, $date_expense, $date_paid) = ($1, $2, $3, $4) if ($entry =~ m/^(.+)\s((?:\d+\.)?\d{1,3},\d{2})\s(\d{2}\.\d{2}\.\d{2})\s(\d{2}\.\d{2}\.\d{2})$/);

working demo

关于python - 正则表达式在 python 模拟器中有效,但在 perl 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61762771/

相关文章:

python - 正则表达式:返回括号内的内容,除非子字符串存在于内部,然后返回括号外的所有内容

python - 如何在pyqt5上用QPixmap实现图片缩放

java - 模式匹配时排除某个模式位于另一个模式内部时

linux - 没有可用于基本错误的 Presto 元数据下载包 :

python - 当决胜局随机时在 python 中排名

python opencv : cannot save the images to the video

java - 在 Java 中使用 RegEx 解析 CSV 输入

Javascript:在文档中查找 URL

windows - 为什么重写二进制文件不起作用?

perl - 在 Perl 中,.pm(Perl 模块)和 .pl(Perl 脚本)文件有什么区别?