【发布时间】:2015-04-03 09:41:59
【问题描述】:
我正在慢慢地从 Perl 转向 Python,并试图了解使用正则表达式的最佳实践。
我有以下 Perl 代码 - 该代码基本上将字符串作为输入,并根据正则表达式匹配和捕获将重新排列的字符串作为输出:
#!/usr/bin/env perl
use strict;
use warnings;
my $str = $ARGV[0] || die "Arg?";
my $result;
if($str =~ m/^\d{12}$/) {
$result = $str;
} elsif($str =~ m{^(\d{2})/(\d{2})/(\d{4})$}) {
$result = "${1}${2}0000${3}";
} elsif($str =~ m{^(\d{4})$}) {
$result = "01010000${1}";
} else {
die "Invalid string";
}
print("Result: $result\n");
在 Python 3 中什么是好的等价物?
到目前为止,我想出了以下内容,但在 elif 部分匹配两次似乎效率低下。在开始时编译所有正则表达式似乎效率低下。
#!/usr/bin/env python3
import re, sys
str = sys.argv[1]
p1 = re.compile('\d{12}')
p2 = re.compile('(\d{2})/(\d{2})/(\d{4})')
p3 = re.compile('(\d{4})')
if p1.match(str):
result = str
elif p2.match(str):
m = p2.match(str)
result = '%s%s0000%s' % (m.group(1), m.group(2), m.group(3))
elif p3.match(str):
m = p3.match(str)
result = '01010000%s' % (m.group(1))
else:
raise Exception('Invalid string')
print('Result: ' + result)
鉴于 Python 的座右铭是“应该有一种——最好只有一种——明显的方式来做到这一点”——关于这里最好的方式是什么的任何想法/建议?
提前感谢您的任何建议。
最好的问候, -帕维尔
【问题讨论】:
-
你不......你不能做有条件的作业
-
将您的正则表达式定义为原始字符串。
-
@JoranBeasley - 我试图弄清楚在 Python 中执行此操作的最佳方法是什么,而我的代码中没有效率低下。
-
@AvinashRaj - 抱歉,不清楚这有什么帮助?
-
对于那些使用 Python 3.8 的人来说仅供参考:赋值表达式是可能的,请参阅 stackoverflow.com/questions/122277/…