python strip string从最贪婪到最后

时间:2014-07-17 16:28:55

标签: python regex

这里是:

str_ = 'file_.csv_.csv.bz2'
re.sub(regex, '', str_)

我想要“正则表达式”值来获取'file_.csv_',即没有实际扩展名的文件名'.csv.bz2',而'.csv.*'可以是.* = ''|bz2|gz|7z| ...任何压缩格式。

更准确地说,我希望re.sub能够最贪婪地从str_的末尾开始匹配。 使用regex = '\.csv.*$',我只会获得'file_'

我当然可以os.path.splitext() - 检查str_是否以'.csv' - os.path.splitext()结尾,如果是的话,但是有更短的方式吗?

2 个答案:

答案 0 :(得分:2)

您可以使用re.split()分割后缀:

result = re.split(r'\.csv(?:\.\w+)?$', filename)[0]

演示:

>>> import re
>>> filename = 'file_.csv_.csv.bz2'
>>> re.split(r'\.csv(?:\.\w+)?$', filename)[0]
'file_.csv_'
>>> re.split(r'\.csv(?:\.\w+)?$', 'foobar_.csv_.csv')[0]
'foobar_.csv_'
>>> re.split(r'\.csv(?:\.\w+)?$', 'foobar_.csv_.csv.gz')[0]
'foobar_.csv_'

答案 1 :(得分:0)

这将删除所有连续扩展并仅打印文件名

>>> s = "file_.csv_.csv.bz2"
>>> m = re.sub(r'[.a-z0-9]+$', r'', s)
>>> m
'file_.csv_'
>>> s = "foobar_.csv_.csv.gz"
>>> m = re.sub(r'[.a-z0-9]+$', r'', s)
>>> m
'foobar_.csv_'