繁体   English   中英

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

[英]Using Regex to Find and Replace

我想获取一个包含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)

然后,我有遍历文本文件的代码,以及带有时间码的“脚+帧”子代码:

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内部使用函数?

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

如果传递可调用对象,则必须使用match对象。

您还应该遵循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))

您的示例代码中有一个额外的'(',它不属于该行。这是该行的内容:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM