Использование регулярного выражения в Python для генерации списка - PullRequest
0 голосов
/ 26 февраля 2012

У меня есть небольшой скрипт, который используется для создания изображения с предопределенным шрифтом и текстом.Я хотел бы изменить его, чтобы использовать несколько шрифтов для отображения одного и того же текста, например буквы A в 5 шрифтах.Я определяю свой список шрифтов как:

fonts = [ 'Georgia', 'Consolas', 'Arial']

, а затем использую его в:

for item in enumerate(fonts) :
 ...

Я хотел бы создать список со всеми, например:Times New Roman семейные шрифты.Я пытался создать список с регулярным выражением, но безуспешно.Я не знаю, как встраивать его в список (с кавычками, с / в начале и в конце и т. Д.)

Я пробовал что-то вроде этого: fonts = [ '/^.Times.*$/' ] и это fonts = [ '/Times.*/g' ], нобезуспешно.

Проблема с Seond возникла, когда я хотел использовать шрифты из 3 слов, такие как Luicida Console Regular, затем я получил эту ошибку:

C:\Users\xxx\Desktop\test.py:46: PangoWarning: couldn't load font "Luicid
a Console 40", falling back to "Sans 40", expect ugly output.
  pangctx.show_layout (layout)

похоже, что скрипт получает только два словаиз названия шрифта.

РЕДАКТИРОВАТЬ

def main ():
    surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
    context = cairo.Context (surface) 
    source  = context.get_source ()
    font    = sys.argv[1]

    fonts    = [ 'Georgia', 'Consolas', 'Arial',  'Lucida Console', 'Times New Roman' ]
    output  = sys.argv[2]
    text    = sys.argv[3]

    background = cairo.SolidPattern (255, 255, 255)
    context.rectangle (0, 0, WIDTH, HEIGHT)
    context.set_source (background)
    context.fill ()

    pangctx = pangocairo.CairoContext (context)

    layout  = pangctx.create_layout () 
    layout.set_width ((WIDTH - 2 * PADDING) * pango.SCALE)
    layout.set_single_paragraph_mode (True)
    layout.set_wrap (pango.WRAP_CHAR)

    size    = 40 * pango.SCALE
    spacing = 10 * pango.SCALE
    markup = ''
    for index, item in enumerate(fonts):
        print index, item
        markup  += '<span font="'+ item +'" size="' + str(size) + '" letter_spacing="' + str(spacing) + '">' + text +'</span>'
    layout.set_markup (markup)
    pangctx.update_layout (layout)

    context.new_path ()
    context.move_to (PADDING, PADDING)
    context.set_source (source)
    context.set_source_rgb (0, 0, 0)

    pangctx.show_layout (layout)
    surface.write_to_png (output)

РЕДАКТИРОВАТЬ кажется, что это все еще ошибка в pango ссылка на панель запуска

Ответы [ 4 ]

2 голосов
/ 26 февраля 2012

Чтобы получить список всех доступных имен шрифтов:

fonts = [f.get_name() for f in layout.get_context().list_families()]

Чтобы оставить только те шрифты, которые соответствуют регулярному выражению, например, выбрать шрифты, которые имеют mono или space в имени (без учета регистра):

mono_fonts = filter(re.compile(r'(?i)mono|space').search, fonts)

Кстати, может быть более удобочитаемо использовать форматирование строки вместо оператора +:

markup += '<span font="{}" size="{}" letter_spacing="{}">{}</span>'.format(
                       item, size, spacing, text)

Мне кажется, что атрибут font работает:

>>> import cairo
>>> import pango
>>> cairo.version
'1.8.8'
>>> pango.version_string()
'1.29.3'
2 голосов
/ 26 февраля 2012

Во-первых, в вашей попытке есть орфографическая ошибка. Это "Lucida", а не "Luicida"

Во-вторых, кажется, вы используете Панго? Почему бы не использовать это, чтобы перечислить все доступные варианты шрифтов? Смотрите, например руководство по pygtk .

Редактировать: Глядя на ваш код и ссылку на Pango Markup Language , кажется, что «шрифт» не является допустимым атрибутом. Попробуйте вместо этого "font_family".

1 голос
/ 26 февраля 2012

В результате появится список всех шрифтов, которые начинаются с «Times» в вашем списке шрифтов:

timesFonts = filter(lambda x: re.match(r'^Times.*', x), fonts)
1 голос
/ 26 февраля 2012

Отфильтруйте список fonts по совпадению с регулярным выражением.

import re
r = re.compile("Times.*")
for item in enumerate(f for f in fonts if r.match(f)):
    ...

В вашем случае вы можете просто проверить наличие строки:

for item in enumerate(f for f in fonts if f.contains("Times")):
    ...

Вам нужно будет предоставитьподробнее о второй ошибке.

...