2012-05-07 8 views
0

私はいくつかのPerlの行をPythonに変更しようとしています。私はperlコードで何が起こっているのかを理解するのに苦労しています 。どんな助けでも大歓迎です。perl正規表現をPythonに変換する

ありがとうございました!

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

私は最初の「$ MYDIR」とどのようにこれは痛いです正規表現 – inbinder

+0

でフォーマット/解析することができるように、それがその後、渡されたのは明らかではありませんよ。 \t \t return args.pop(0) – inbinder

+1

私はこれに私のアプローチを再考し、より多くの利点を得る必要があると考え始めています。これは私のmydir = shift @ARGVdef pop_func(* args)私が真っ直ぐな港の代わりに私の処分でパイソンを持っているという事実のことです。 – inbinder

答えて

1

3つの成分に$mydirは、最初の二つはバックスラッシュで終わるm/(.*\\)(.*\\)(.*)/分割の最初の行(例えば

$mydirAsdf\fdsa\jklた場合、最初の行は$junk2 = jkl

$filename = fdsa\$junk1 = Asdf\設定します

ライン

$filename =~ s/\\//; 

$filenamefdsa\)をとり、最後のバックスラッシュ(構文はs/stuff_to_match/stuff_to_substitute_with/)を削除します。

re moduleを使って正規表現の処理を行うことができます。この場合は、バックスラッシュで分割して正規表現の必要性を排除するように見えます。

+0

ありがとうございました。これは非常に便利です。 – inbinder

1

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

これはどちらか(間違って)ファイル名を取得しようとしたり、実際には、ターゲット・ファイルの入ったフォルダを取得します。

$filename =~ s/\\//;

任意の先頭または末尾のパス区切りを削除します。それは正規表現の成功または失敗をチェックしないので、Perl BTWは良く書かれていません。

ので、これが結果です:

my $mydir="c:\\music\\ap\\mahadeva.mp3";  
my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/; 
$filename =~ s/\\//; 
print $filename, "\n"; 

プリント:ap

Pythonの再への直訳は、次のとおりです。

まあ
import re 

mydir="c:\\music\\ap\\mahadeva.mp3" 

m=re.search(r'(.*\\)(.*\\)(.*)', mydir) 
if m: 
    print re.sub(r'\\', '', m.group(2)) 

ないPERFECT翻訳、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に移植しようとするのではなく、直接問題を解決することができます。 –