2012-05-07 30 views
0

我試圖將perl的一些行改爲python,我正在努力理解 Perl代碼中發生了什麼。任何幫助將不勝感激。將perl正則表達式轉換爲python

謝謝!

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

我不是第一個「$ MYDIR」,以及如何再傳遞,以便它可以被解析/用正則表達式 – inbinder

+0

這是痛苦的格式清楚。這是相當於我的$ mydir = shift @ARGVdef pop_func(*參數): \t \t返回args.pop(0) – inbinder

+1

我開始認爲我需要重新思考我的方法,並採取更多的優勢事實上,我有蟒蛇在我的處置,而不是一個直接的端口。 – inbinder

回答

1

第一行(具有m/(.*\\)(.*\\)(.*)/拆分$mydir成三個部分,第一兩個反斜槓結束。

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

該行

$filename =~ s/\\//; 

需要$filenamefdsa\)並刪除最後一個反斜槓(語法爲s/stuff_to_match/stuff_to_substitute_with/)。

在python中,你可以使用re module來做正則表達式的東西,或者在這種情況下,它看起來像你可以在反斜槓上分割,不需要正則表達式。

+0

非常感謝。這是超級有用的。 – inbinder

1

my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;

這是(不正確地)試圖獲取文件名或者,實際上,獲取目標文件的包含文件夾。

$filename =~ s/\\//;

移除任何前導或尾隨路徑分隔符。由於它不檢查正則表達式的成功或失敗,所以它寫得很差。

所以,這就是結果:

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' 
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' 
+0

我想我得到你要去的地方。 – inbinder

+0

對於上面的Perl代碼,你能幫助我多一點嗎? – inbinder

+0

@ user1124541:我不知道Perl。 ;)更嚴重的是,你能澄清你真正想做什麼嗎?然後,我們可以直接解決問題,而不是嘗試將Perl移植到Python。 –

相關問題