0

我想获取一个包含 Feet+Frames 值的文本文档并将它们转换为时间码。例如,将 0000+00 替换为 00:00:00:00。

我有一个函数可以将英尺+帧转换为时间码(每英尺 16 帧,帧速率为每秒 24 帧):

def FeetFramesToTimecode(FeetFrames):
    frames = int(FeetFrames[:4])*16+int(FeetFrames[-2:])
    return "%02d:%02d:%02d:%02d" % (frames/(3600*framerate), frames/(60*framerate)%60, frames/framerate%60, frames%framerate)

然后我有通过文本文件的代码,并且是带有时间码的 Feet+Frame:

for line in input_document:
    found = re.search(r'\d{4}\+\d{2}', line)
    if found:
        print "%s replaces %s" % (FeetFramesToTimecode(found.group()), found.group())
        new_line = re.sub(r'\d{4}\+\d{2}', (FeetFramesToTimecode(found.group()), line)
        output_document.write(new_line)
    else:
        output_document.write(line)

那么,我做错了什么?如何让函数在 re.sub 中工作?

4

2 回答 2

1

resub可以采用可调用的第二个参数,而不仅仅是替换字符串。

如果您传递一个可调用对象,它必须采用匹配对象。

您还应该遵循python pep8以使 python 更具可读性(对于其他 pythonistas)

就像是:

def feetframes_to_timecode(feetframes_match, framerate=24):
    feetframes = feetframes_match.group()
    frames = int(feetframes[:4])*16+int(feetframes[-2:])
    return "%02d:%02d:%02d:%02d" % (frames/(3600*framerate),
                                    frames/(60*framerate)%60,
                                    frames/framerate%60,
                                    frames%framerate)
# then just use:
for line in input_document:
    output_document.write(re.sub(r'\d{4}\+\d\d', feetframes_to_timecode, line))
于 2013-06-07T03:22:25.837 回答
0

您的示例代码有一个额外的 '(' 不属于。这应该是该行:

new_line = re.sub(r'\d{4}\+\d{2}', FeetFramesToTimecode(found.group()), line)

这为我产生了你想要的输出。

于 2013-06-07T03:09:29.883 回答