我正在尝试编写一个正则表达式,它将完整路径文件名转换为给定文件类型的短文件名,减去文件扩展名。
例如,我正在尝试使用
从字符串中获取.bar文件的名称re.search('/(.*?)\.bar$', '/def_params/param_1M56/param/foo.bar')
根据Python文档,*?
是*
的不同版本,所以我期待得到
'foo'
为[{1}}返回,但我得到了
match.group(1)
我在这里想到的贪婪是什么?
答案 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')