在python中去除正则表达式

时间:2011-04-20 20:35:24

标签: python regex greedy non-greedy

我正在尝试编写一个正则表达式,它将完整路径文件名转换为给定文件类型的短文件名,减去文件扩展名。

例如,我正在尝试使用

从字符串中获取.bar文件的名称
re.search('/(.*?)\.bar$', '/def_params/param_1M56/param/foo.bar')

根据Python文档,*?*的不同版本,所以我期待得到

'foo'

为[{1}}返回,但我得到了

match.group(1)

我在这里想到的贪婪是什么?

7 个答案:

答案 0 :(得分:8)

你所缺少的不仅仅是关于正则表达式引擎的贪婪:它们从左到右工作,所以/尽可能匹配,然后强制.*?从那里工作。在这种情况下,最好的正则表达式根本不涉及贪婪(你需要回溯才能工作;它会,但如果有很多斜杠,可能需要很长时间才能运行),但更明确的模式:

'/([^/]*)\.bar$'

答案 1 :(得分:3)

我建议改变你的正则表达式,使它不依赖于贪婪。

您只需要扩展名.bar之前的文件名以及最终/之后的所有内容。这应该做:

re.search(`/[^/]*\.bar$`, '/def_params/param_1M56/param/foo.bar')

它的作用是匹配/,然后是 /然后.bar的零个或多个字符(尽可能多)。< / p>

答案 2 :(得分:0)

我并没有声称能够很好地理解非贪婪的算子,但针对该特定问题的解决方案是使用([^ /] *?)

答案 3 :(得分:0)

正则表达式从右侧开始。在开始时放一个。*它应该可以工作。

答案 4 :(得分:0)

我喜欢正则表达式,但这里不需要一个。

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

答案 5 :(得分:0)

其他人已回答了正则表达式问题,但在这种情况下,有一种比正则表达式更有效的方式:

file_name = path[path.rindex('/')+1 : path.rindex('.')]

答案 6 :(得分:-1)

试试这个尺寸:

match = re.search('。* /(。*?)。bar $','/ def_params / param_1M56 / param / foo.bar')