将perl正则表达式转换为python

将perl正则表达式转换为python,python,Python,我正在尝试将一些perl代码行更改为python,我正在努力理解 perl代码中发生了什么。任何帮助都将不胜感激 谢谢 my($junk1, $filename, $junk2) = $mydir =~ m/(.*\\)(.*\\)(.*)/; $filename =~ s/\\//; print $out $filename, "\n"; 第一行(带有m/(.\\)(.\\)(.\\)/将$mydir拆分为三个部分,前两个以反斜杠结尾 例如,如果$mydir

我正在尝试将一些perl代码行更改为python,我正在努力理解 perl代码中发生了什么。任何帮助都将不胜感激

谢谢

    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\u to\u match/stuff\u to\u substitute\u with/

在python中,您可以使用to do regex,或者在本例中,您可以在反斜杠上拆分,从而消除对regex的需要。

第一行(使用
m/(.\\\)(.\\\)(.*)/
$mydir
拆分为三个组件,前两个以反斜杠结尾

例如,如果
$mydir
Asdf\fdsa\jkl
,则第一行设置
$junk1=Asdf\
$filename=fdsa\
$junk2=jkl

线路

$filename =~ s/\\//;
采用
$filename
fdsa\
)并删除最后一个反斜杠(语法为
s/stuff\u to\u match/stuff\u to\u substitute\u with/

在python中,您可以使用来执行正则表达式,或者在本例中,您可以使用反斜杠进行拆分,从而消除对正则表达式的需要。

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 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'
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 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
模块解释了操作系统之间的许多差异(目录分隔符-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'

不要使用正则表达式分割文件路径

相反,请使用和字符串函数。特别是,
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'

非常感谢。这非常有帮助。非常感谢。这非常有帮助。我想我明白你的意思了。你能帮我在上面的perl代码中使用这一点吗?@user1124541:我不知道perl;)更严重的是,你能澄清你真正想要做什么吗?然后我们可以直接解决问题,而不是尝试将Perl移植到Python.me:)我正在尝试格式化一些文件,我有一个Perl文件,它可以满足我的需要,但考虑到我的任务范围更大,这很不方便。我想我已经了解了你的意图。你能帮我在上面的perl代码中使用这一点吗?@user1124541:我不知道perl;)更严重的是,你能澄清你到底想做什么吗?然后我们可以直接解决问题,而不是尝试将Perl移植到Python.me:)我正在尝试格式化一些文件,我有一个Perl文件可以满足我的需要,但是考虑到我的任务范围更大,这很不方便。我不清楚第一个“$mydir”然后是如何传递的,这样就可以用正则表达式对其进行解析/格式化这很痛苦。这是否等同于我的$mydir=shift@ARGVdef pop_func(*args):return args.pop(0)我开始认为我需要重新考虑我的方法,并更多地利用我拥有python而不是直接向上的端口这一事实。您添加的第二位只是全局搜索文本文件目录。这在Python中也很容易。我不清楚第一个“$mydir”以及它是如何被传递的,这样它就可以被正则表达式解析/格式化。这很痛苦。这是否等同于我的$mydir=shift@ARGVdef pop_func(*args):return args.pop(0)我开始认为我需要重新考虑我的方法,并更多地利用我拥有python而不是直接向上的端口这一事实。您添加的第二位只是全局搜索文本文件目录。这在Python中也很容易。