python中正则表达式的去希腊化
我试图编写一个正则表达式,将给定文件类型的完整路径文件名转换为短文件名,减去文件扩展名 例如,我试图使用python中正则表达式的去希腊化,python,regex,greedy,non-greedy,Python,Regex,Greedy,Non Greedy,我试图编写一个正则表达式,将给定文件类型的完整路径文件名转换为短文件名,减去文件扩展名 例如,我试图使用 re.search('/(.*?)\.bar$', '/def_params/param_1M56/param/foo.bar') 根据Python文档,*?是*的ungreedy版本,所以我希望 'foo' 为match.group(1)返回,但我得到了 'def_params/param_1M56/param/foo' 关于贪婪,我在这里遗漏了什么?我建议更改您的正则表达式,使其不
re.search('/(.*?)\.bar$', '/def_params/param_1M56/param/foo.bar')
根据Python文档,*?
是*
的ungreedy版本,所以我希望
'foo'
为match.group(1)
返回,但我得到了
'def_params/param_1M56/param/foo'
关于贪婪,我在这里遗漏了什么?我建议更改您的正则表达式,使其不依赖于贪婪 您只需要扩展名
.bar
之前的文件名,以及最后一个/
之后的所有内容。这应该做到:
re.search(`/[^/]*\.bar$`, '/def_params/param_1M56/param/foo.bar')
它所做的是匹配
/
,然后零个或多个非/
字符(尽可能多),然后再匹配.bar
我建议更改正则表达式,使其不依赖于greedyness
您只需要扩展名.bar
之前的文件名,以及最后一个/
之后的所有内容。这应该做到:
re.search(`/[^/]*\.bar$`, '/def_params/param_1M56/param/foo.bar')
它的作用是匹配
/
,然后零个或多个非/
字符(尽可能多),然后再匹配.bar
,我并不认为自己对非贪婪运算符有那么好的理解,但解决这个问题的方法是使用([^/]*?)我并不认为自己对非贪婪运算符有那么好的理解,但是解决这个问题的方法是使用([^/]*?)正则表达式从右边开始。在开始处放一个。*,它应该可以工作。正则表达式从右边开始。在一开始就放一个.*,它应该可以工作。你缺少的不是贪婪,而是正则表达式引擎:它们从左到右工作,所以/
会尽早匹配,*?
会从那里开始工作。在这种情况下,最好的正则表达式根本不涉及贪婪(你需要回溯才能工作;它会,但如果有很多斜杠,可能需要很长时间才能运行),而是一个更明确的模式:
'/([^/]*)\.bar$'
您缺少的不是贪婪,而是正则表达式引擎:它们从左到右工作,因此
/
尽早匹配,*?
然后被迫从那里工作。在这种情况下,最好的正则表达式根本不涉及贪婪(你需要回溯才能工作;它会,但如果有很多斜杠,可能需要很长时间才能运行),而是一个更明确的模式:
'/([^/]*)\.bar$'
试试这件衣服,看看大小:
match=re.search('.*/(.*?).bar$,'/def_params/param_1M56/param/foo.bar')试试这一款,看看大小:
match=re.search('.*/(.*?).bar$,'/def_params/param_1M56/param/foo.bar')我喜欢正则表达式,但这里不需要
path = '/def_params/param_1M56/param/foo.bar'
print path.rsplit('/',1)[1].rsplit('.')[0]
path = '/def_params/param_1M56/param/fululu'
print path.rsplit('/',1)[1].rsplit('.')[0]
path = '/def_params/param_1M56/param/one.before.two.dat'
print path.rsplit('/',1)[1].rsplit('.',1)[0]
结果
foo
fululu
one.before.two
我喜欢正则表达式,但这里不需要正则表达式
path = '/def_params/param_1M56/param/foo.bar'
print path.rsplit('/',1)[1].rsplit('.')[0]
path = '/def_params/param_1M56/param/fululu'
print path.rsplit('/',1)[1].rsplit('.')[0]
path = '/def_params/param_1M56/param/one.before.two.dat'
print path.rsplit('/',1)[1].rsplit('.',1)[0]
结果
foo
fululu
one.before.two
其他人已经回答了regex的问题,但在这种情况下,有一种比regex更有效的方法:
file_name = path[path.rindex('/')+1 : path.rindex('.')]
其他人已经回答了regex的问题,但在这种情况下,有一种比regex更有效的方法:
file_name = path[path.rindex('/')+1 : path.rindex('.')]
正则表达式中的
匹配任何内容,而不是扩展文件的
。确保您正在使用编辑的\.
Woops:)转义
。我希望这不是投票失败的原因,因为这与问题无关虽然它可能与此问题无关,但OP可能希望(现在或以后)使用它来匹配扩展名为bar
的文件,并且该文件也将匹配.abar
,例如:)正则表达式中的
匹配任何内容,而不是扩展名文件的
。确保您正在使用编辑的\.
Woops:)转义
。我希望这不是投票失败的原因,因为这与问题无关虽然它可能与此问题无关,但可能OP希望(现在或以后)使用它来匹配扩展名为bar
的文件,并且该文件也会匹配.abar
,例如:)如果您已经在使用。*/
,我认为您真的不需要*?
*
也可以:)你能编辑你的问题吗,这样我就可以再次投票给你了?如果你已经在使用。*/
,我想你真的不需要*?
*
也可以:)你能编辑你的问题吗,这样我就可以再次投票给你了?我在发布问题后就发现了这个问题。但我还是想知道贪婪的本质。您也可以只使用path.split('/')[-1].split('.')[0]
在我发布问题后,我实际上已经找到了答案。但我还是想知道贪婪的本质。您也可以只使用path.split('/')[-1].split('.')[0]