0

我有一个文件名,它总是以一个带有文件扩展名的数字结尾,例如:

filename = 'photo_v_01_20415.jpg'

从它的文件名中,我需要提取文件扩展名和文件扩展名之前的最后一个数字。由于拆分,我应该有两个字符串:

original_string = 'photo_v_01_20415.jpg'

string_result_01 = `photo_v_01_`  (first half of the file name)

string_result_02 = `20415.jpg`    (second half of the file name).

问题是传入的文件名将不一致。最后一个数字可以通过下划线“_”、空格“”、句点“.”与其文件名分隔。或其他任何东西。可能的文件名示例:

photo_v_01_20415.jpg
photo_v_01.20415.jpg
photo_v_01 20415.jpg
photo_v_01____20415.jpg

看来我需要使用 re. 带有 re.search 或 re.sub 的表达式。我将不胜感激任何建议!

4

3 回答 3

3
import re

names = '''\
photo_v_01_20415.jpg
photo_v_01.20415.jpg
photo_v_01 20415.jpg
photo_v_01____20415.jpg'''.splitlines()

for name in names:
    prefix, suffix = re.match(r'(.+?[_. ])(\d+\.[^.]+)$', name).groups()
    print('{} --> {}\t{}'.format(name, prefix, suffix))

产量

photo_v_01_20415.jpg --> photo_v_01_    20415.jpg
photo_v_01.20415.jpg --> photo_v_01.    20415.jpg
photo_v_01 20415.jpg --> photo_v_01     20415.jpg
photo_v_01____20415.jpg --> photo_v_01____  20415.jpg

正则表达式模式r'(.+?[_. ])(\d+\.[^.]+)$'意味着

r'             define a raw string
(              with first group
     .+?           non-greedily match 1-or-more of any character
     [_. ]         followed by a literal underscore, period or space
)              end first group 
(              followed by second group
     \d+           1-or-more digits in [0-9]
     \.            literal period
     [^.]+         1-or-more of anything but a period
)              end second group 
$              match the end of the string
'              end raw string
于 2013-09-25T20:56:28.063 回答
3

使用re.match而不是re.search将所有字符串与模式匹配。因此

import re

def split_name(filename):
    match = re.match(r'(.*?)(\d+\.[^.]+)', filename)
    if match:
        return match.groups()
    else:
        return None, None

for name in [ 'foo123.jpg', 'bar;)234.png', 'baz^_^456.JPEG', 'notanumber.bmp' ]:
    prefix, suffix = split_name(name)
    print("prefix = %r, suffix = %r" % (prefix, suffix))

印刷:

prefix = 'foo', suffix = '123.jpg'
prefix = 'bar;)', suffix = '234.png'
prefix = 'baz^_^', suffix = '456.JPEG'
prefix = None, suffix = None

适用于任意后缀;如果文件名与模式不匹配,则匹配失败,返回 None, None。

于 2013-09-25T20:59:30.967 回答
0
import re

matcher = re.compile('(.*[._ ])(\d+.jpg)')
result = matcher.match(filename)

根据需要向 [._ ] 添加其他选项。

于 2013-09-25T21:03:49.990 回答