繁体   English   中英

有没有更干净的方法可以执行此循环?

[英]Is there a cleaner way to do this loop?

谁能帮助我提出一种使此循环更简单的解决方案。 该代码运行良好,但对于它的功能来说似乎太多了。

    font_sizes = map(int, re.findall(r'\\fs(\d+)', rtf)) # Get all the font sizes
    # Set font sizes
    for font_size in font_sizes:
        font_size = (font_size / 2)
        if font_size <= 8:
                rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(1))
        else:
            if 9 <= font_size <= 11:
                rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(2))
            else:
                if 12 <= font_size <= 13:
                    rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(3))
                else:
                    if 14 <= font_size <= 17:
                        rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(4))
                    else:
                        if 18 <= font_size <= 31:
                            rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(5))
                        else:
                            if 32 <= font_size <= 34:
                                rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(6))
                            else:
                                if 35 <= font_size <= 59:
                                    rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(7))
                                else:
                                    if font_size > 60:
                                        rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(8))
                                    else:
                                        pass

首先,可以使用elif避免嵌套得太深:

if font_size <= 8:
    rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(1))

elif 9 <= font_size <= 11:
    rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(2))

elif 12 <= font_size <= 13:
    rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(3))

# etc

您可以删除else: pass完全else: passelse是可选的,不使用时应将其忽略。

接下来,剔除共同要素; str.replace()调用; 它们之间的唯一区别是替换字体大小, 只需在每个分支中选择一个即可:

if font_size <= 8:
    size = 1
elif 9 <= font_size <= 11:
    size = 2
elif 12 <= font_size <= 13:
    size = 3
# etc.

rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(size))

由于您不会一直重复自己,因此更具可读性。

您可以每次删除下限,因为您已经通过前面的测试消除了下限:

if font_size <= 8:
    size = 1
elif font_size <= 11:
    size = 2
elif font_size <= 13:
    size = 3
# etc.

现在您所面临的就是两分问题 ; 找到与font-size匹配的大小就像在font_sizes列表中找到它的插入点一样简单; 您将其插入的位置是0到7之间的索引,因此您需要添加1:

import bisect

font_sizes = [8, 11, 13, 17, 31, 34, 59]
size = bisect.bisect_left(font_sizes, font_size) + 1
rtf = rtf.replace("\\fs{0}".format(font_size * 2), "<font size='{0}'>".format(size))

我不确定为什么要将字体大小除以2。 上述3条线的工作只是用分割的字体大小细。

由于要替换元素,因此您实际上应该在这里使用re.sub() ,并使用函数来产生替换:

def insert_fontsize(match):
    font_sizes = [16, 22, 26, 34, 62, 68, 118]
    size = bisect.bisect_left(font_sizes, int(match.group(1))) + 1
    return '<font size="{0}">'.format(size)

re.sub(r'\\fs(\d+)', insert_fontsize, rtf)

现在, re.sub()调用将进行循环,而不是循环然后进行手动替换。

暂无
暂无

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

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