我正在尝试将某些perl行更改为python,而我正在努力理解 perl代码中发生了什么。任何帮助将不胜感激。
谢谢!
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
$filename =~ s/\\//;
print $out $filename, "\n";
答案 0 :(得分:3)
不要使用正则表达式来切断文件路径。
相反,请使用os.path
module和字符串函数。特别是,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'
答案 1 :(得分:1)
第一行(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
module来做正则表达式的东西,或者在这种情况下看起来你可以拆分反斜杠,不需要正则表达式。
答案 2 :(得分:1)
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
这(错误地)尝试获取文件名,或者实际上获取目标文件的包含文件夹。
$filename =~ s/\\//;
删除任何前导或尾随路径分隔符。 Perl BTW编写得很糟糕,因为它没有检查正则表达式的成功或失败。
所以,这就是结果:
my $mydir="c:\\music\\ap\\mahadeva.mp3";
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
$filename =~ s/\\//;
print $filename, "\n";
打印:ap
Python的字面翻译是:
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'