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

最初の行( 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モジュールを使用して正規表現を実行できます。この場合、バックスラッシュで分割して正規表現の必要性をなくすことができるように見えます。

于 2012-05-07T23:38:27.857 に答える
1

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'
于 2012-05-08T02:14:09.163 に答える