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

Python 使用正则表达式查找和替换,python,regex,function,Python,Regex,Function,我想获取一个包含英尺+帧值的文本文档,并将其转换为时间码。例如,0000+00将替换为00:00:00:00 我有一个功能可以将英尺+帧转换为时间码(每英尺16帧,帧速率为每秒24帧): 然后我有代码,通过文本文件和子的脚+帧与时间码: for line in input_document: found = re.search(r'\d{4}\+\d{2}', line) if found: print "%s replaces %s" % (FeetFrames

我想获取一个包含英尺+帧值的文本文档,并将其转换为时间码。例如,0000+00将替换为00:00:00:00

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

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

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内部工作?

您的示例代码中有一个额外的“(”不属于该函数。这是该行的内容:

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

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

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

如果传递一个可调用对象,它必须接受匹配对象

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

比如:

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))

风格-请为类和保存
CamelCase
。(即
def feet\u frames\u to\u time\u code(feet\u frames)
)。这会让事情变得更清楚。(注意,您的问题突出显示的CamelCase与其他代码有什么不同?)今天我学了一个新单词…CamelCase。正如我所说,我对编程知之甚少…更不用说什么是类了。我正在学习,并感谢你的输入。如果你学会了,不妨说那是PascalCase,而不是CamelCase。=)Doh!这一次我感觉像荷马。感谢您指出这一点。我为我糟糕的脚本编写表示歉意,因为我在这方面没有接受过正式的教育。我只是有了一个想法,用谷歌搜索我的最终脚本。我将看看pep8是什么,并尝试改进我的格式。谢谢你在这方面的帮助!啊!我懂了!将match.group()移到函数中!那是个好主意。
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))