任何人都可以帮我提出一个解决方案,使这个循环更简单。代码运行良好,但它似乎太多了。
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
答案 0 :(得分:11)
首先,您可以使用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
是可选的,您应该在不使用时省略它。
接下来,分解出共同的元素; str.replace()
电话;它们之间的不同之处是替换fontsize,在每个分支中选择 :
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.
现在你拥有的只是bisection problem;找到使用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()
调用将执行循环,而不是循环,然后进行手动替换。