私は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'
最初の行( 3つのコンポーネントにm/(.*\\)(.*\\)(.*)/
分割$mydir
され、最初の2つは円記号で終わります。
たとえば、$mydir
だった場合Asdf\fdsa\jkl
、最初の行は、、$junk1 = Asdf\
を$filename = fdsa\
設定し$junk2 = jkl
ます。
この線
$filename =~ s/\\//;
$filename
( )を取りfdsa\
、最後の円記号を削除します(構文はs/stuff_to_match/stuff_to_substitute_with/
)。
Pythonでは、re
モジュールを使用して正規表現を実行できます。この場合、バックスラッシュで分割して正規表現の必要性をなくすことができるように見えます。
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
これは(誤って)ファイル名を取得しようとするか、実際にはターゲットファイルの包含フォルダーを取得します。
$filename =~ s/\\//;
先頭または末尾のパスセパレータを削除します。正規表現の成功または失敗をチェックしないため、PerlBTWの記述は不十分です。
だから、これは結果です:
my $mydir="c:\\music\\ap\\mahadeva.mp3";
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/;
$filename =~ s/\\//;
print $filename, "\n";
プリント:ap
Pythonreへの直訳は次のとおりです。
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'