Как мне разобрать шаблонную строку в Python? - PullRequest
3 голосов
/ 20 мая 2010

Я новичок в Python, поэтому точно не знаю, как называется эта операция, поэтому мне сложно искать информацию в ней.

В основном я хотел бы иметь такую ​​строку, как:

"[[size]] widget that [[verb]] [[noun]]"

Где размер, глагол и существительное являются списком.

Я бы хотел интерпретировать строку как метаязык, чтобы я мог составлять множество предложений из перестановок из списков. Как метаязык, я также мог бы создавать другие строки, использующие эти предопределенные списки, чтобы генерировать больше перестановок.

Есть ли в Python возможности для подстановки переменных, подобные этой? Какой термин описывает эту операцию, если я должен просто Google это?

Ответы [ 5 ]

4 голосов
/ 20 мая 2010

Если вы измените свой синтаксис на

"{size} widget that {verb} {noun}"

Тогда вы можете использовать строковый метод format для подстановки:

"{size} widget that {verb} {noun}".format(size='Tiny',verb='pounds',noun='nails')

или

choice={'size':'Big',
    'verb':'plugs',
    'noun':'holes'}
"{size} widget that {verb} {noun}".format(**choice)
2 голосов
/ 20 мая 2010

Вот одна из возможных реализаций, если у вас есть списки sizes, verbes, nounes:

import itertools, string

t = string.Template("$size widget that $verb $noun")
for size, verb, noun in itertools.product(sizes, verbes, nounes):
    print t.safe_substitute(size=size, verb=verb, noun=noun)
1 голос
/ 20 мая 2010

Попробуйте этот скрипт:

import random #just needed for the example, not the technique itself
import re # regular expression module for Python

template = '[[size]] widget that [[verb]] [[noun]]'
p = re.compile('(\[\[([a-z]+)\]\])') # match placeholder and the word inside
matches = p.findall(template) # find all matches in template as a list

#example values to show you can do substitution
values = {
    'size': ('tiny', 'small', 'large'),
    'verb': ('jumps', 'throws', 'raises'),
    'noun': ('shark', 'ball', 'roof')
}

print 'After each sentence is printed, hit Enter to continue or Ctrl-C to stop.'

while True: # forever
    s = template
    #this loop replaces each placeholder [[word]] with random value based on word
    for placeholder, key in matches:
        s = s.replace(placeholder, random.choice(values[key]))
    print s
    try:
        raw_input('') # pause for input
    except KeyboardInterrupt: #Ctrl-C
        break # out of loop

Пример вывода:

large widget that jumps ball

small widget that raises ball

small widget that raises ball

large widget that jumps ball

small widget that raises ball

tiny widget that raises shark

small widget that jumps ball

tiny widget that raises shark
1 голос
/ 20 мая 2010

Вы хотите использовать re.sub() или эквивалентный ему метод регулярного выражения с функцией обратного вызова.

0 голосов
/ 20 мая 2010

регулярное выражение является излишним. Используйте циклы, чтобы установить размер глагола и переменные существительного затем:

print("%(size)s widget that %(verb)s %(noun)s" % {"size":size, "verb":verb, "noun":noun})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...