我正在尝试将一些 perl 行更改为 python,并且我正在努力理解 perl 代码中发生了什么。任何帮助将不胜感激。
谢谢!
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
$filename =~ s/\\//;
print $out $filename, "\n";
我正在尝试将一些 perl 行更改为 python,并且我正在努力理解 perl 代码中发生了什么。任何帮助将不胜感激。
谢谢!
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
$filename =~ s/\\//;
print $out $filename, "\n";
不要使用正则表达式来分割文件路径。
相反,使用os.path
模块和字符串函数。特别是,该os.path
模块解释了操作系统之间的许多差异(目录分隔符 - unix/
与 windows\\
等),这使您的代码更有可能在不同的计算机上运行。
>>> mypath = "D:\\lws\\vc\\.git\\objects\\dd"
>>> mydir = os.path.dirname(mypath)
>>> mydir
'D:\\lws\\vc\\.git\\objects'
>>> dirs = mydir.split(os.path.sep) # On windows, os.path.sep is `\\`.
>>> dirs
['D:', 'lws', 'vc', '.git', 'objects']
>>> dirs[0:2]
['D:', 'lws']
>>> filename = os.path.basename(mypath)
>>> filename
'dd'
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
这要么(错误地)尝试获取文件名,要么实际上获取目标文件的包含文件夹。
$filename =~ s/\\//;
删除任何前导或尾随路径分隔符。顺便说一句,Perl 写得不好,因为它不检查正则表达式的成功或失败。
所以,结果如下:
my $mydir="c:\\music\\ap\\mahadeva.mp3";
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
$filename =~ s/\\//;
print $filename, "\n";
印刷:ap
Python re 的直译是:
import re
mydir="c:\\music\\ap\\mahadeva.mp3"
m=re.search(r'(.*\\)(.*\\)(.*)', mydir)
if m:
print re.sub(r'\\', '', m.group(2))
这不是完美的翻译,因为 Python 会检查匹配,而 Perl 版本不会。
不过,在 Python 中有更简单的方法可以做到这一点(还有 Perl)。你可以这样做:
print p.split('\\') # ['c:', 'music', 'ap', 'mahadeva.mp3']
print p.split('\\')[-2] # prints 'ap'
第一行(m/(.*\\)(.*\\)(.*)/
分为$mydir
三个部分,前两个部分以反斜杠结尾。
例如,如果$mydir
是Asdf\fdsa\jkl
,第一行设置$junk1 = Asdf\
, $filename = fdsa\
, $junk2 = jkl
.
线
$filename =~ s/\\//;
接受$filename
( fdsa\
) 并删除最后一个反斜杠(语法为s/stuff_to_match/stuff_to_substitute_with/
)。
在 python 中,您可以使用该re
模块来执行正则表达式,或者在这种情况下,您看起来可以只拆分反斜杠,从而无需正则表达式。