我正在逐渐从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的座右铭是“做事应该有一种——最好只有一种——显而易见的方法”,那么在这里,您有什么想法/建议,哪种方法才是最好的呢?
提前感谢您的任何建议。
此致敬礼, -Pavel