使用正则表达式查找和替换

时间:2013-06-07 02:51:14

标签: python regex function

我想要一个包含Feet + Frames值的文本文档,并将它们转换为Timecodes。例如,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)

然后我有代码通过文本文件和子脚的脚+帧与时间码:

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?

中使用函数

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

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

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

这就像你想要的那样为我产生了输出。