[英]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: pass
, else
是可选的,不使用时应将其忽略。
接下来,剔除共同要素; 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.