Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中正则表达式的去希腊化_Python_Regex_Greedy_Non Greedy - Fatal编程技术网

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]