我試圖將perl的一些行改爲python,我正在努力理解 Perl代碼中發生了什麼。任何幫助將不勝感激。將perl正則表達式轉換爲python
謝謝!
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
$filename =~ s/\\//;
print $out $filename, "\n";
我試圖將perl的一些行改爲python,我正在努力理解 Perl代碼中發生了什麼。任何幫助將不勝感激。將perl正則表達式轉換爲python
謝謝!
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
$filename =~ s/\\//;
print $out $filename, "\n";
第一行(具有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來做正則表達式的東西,或者在這種情況下,它看起來像你可以在反斜槓上分割,不需要正則表達式。
非常感謝。這是超級有用的。 – inbinder
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'
不要使用正則表達式來截斷文件路徑。
而是使用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'
我不是第一個「$ MYDIR」,以及如何再傳遞,以便它可以被解析/用正則表達式 – inbinder
這是痛苦的格式清楚。這是相當於我的$ mydir = shift @ARGVdef pop_func(*參數): \t \t返回args.pop(0) – inbinder
我開始認爲我需要重新思考我的方法,並採取更多的優勢事實上,我有蟒蛇在我的處置,而不是一個直接的端口。 – inbinder