2014-09-15 4 views
0

Может ли кто-нибудь помочь мне придумать решение, которое упростит этот цикл. Код работает нормально, но просто кажется слишком большим для того, что он делает.Есть ли более чистый способ сделать этот цикл?

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 
+4

Ну, для начала: 'elif' ?! – jonrsharpe

+0

Ваш код не требует пояснений * вообще *. Что ты пытаешься сделать?! –

+1

создать сопоставление, словарь, например –

ответ

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

Я не уверен, почему вы разделив размер шрифта на два; вышеуказанные 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() вызов будет делать зацикливание, а не вас цикла, а затем делать вручную замены ,

+0

Есть еще одна проблема, которая возникает, если строка содержит что-то вроде 'r «\ fs2 \ fs20''. Я бы подумал об использовании 're.split', чтобы изолировать теги размера шрифта. –

+0

'bisect' - это путь. – Matthias

+0

@YannVernier: Или просто используйте 're.sub()' вместо этого. –

Смежные вопросы