0

我正在尝试将一些 perl 行更改为 python,并且我正在努力理解 perl 代码中发生了什么。任何帮助将不胜感激。

谢谢!

    my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
    $filename =~ s/\\//;
        print $out $filename, "\n"; 
4

3 回答 3

3

不要使用正则表达式来分割文件路径。

相反,使用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'
于 2012-05-08T02:47:07.027 回答
1

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'
于 2012-05-08T02:14:09.163 回答
1

第一行(m/(.*\\)(.*\\)(.*)/分为$mydir三个部分,前两个部分以反斜杠结尾。

例如,如果$mydirAsdf\fdsa\jkl,第一行设置$junk1 = Asdf\, $filename = fdsa\, $junk2 = jkl.

线

$filename =~ s/\\//;

接受$filename( fdsa\) 并删除最后一个反斜杠(语法为s/stuff_to_match/stuff_to_substitute_with/)。

在 python 中,您可以使用该re模块来执行正则表达式,或者在这种情况下,您看起来可以只拆分反斜杠,从而无需正则表达式。

于 2012-05-07T23:38:27.857 回答