2013-05-16 6 views
2

Я пытаюсь создать нечто вроде предложений со случайными словами, помещенными в них. Чтобы быть конкретными, я бы что-то вроде:Python - tokenizing, replace words words

"The weather today is [weather_state]." 

и быть в состоянии сделать что-то, как найти все маркера в [квадратных скобках], и чем обменять их на рандомизированную коллегу из словаря или, оставив список меня с:

"The weather today is warm." 
"The weather today is bad." 

или

"The weather today is mildly suiting for my old bones." 

Имейте в виду, что положение [] скобки знак не будет всегда находиться в том же положении, и там будет кратно квадратные скобки т okens в моей строке, например:

"[person] is feeling really [how] today, so he's not going [where]." 

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

EDIT: Для уточнения, мне не нужно использовать квадратные скобки, любой нестандартный символ будет делать.

+0

Может быть глупый совет, но вы смотрели на строки форматирования с '{}' ы? – akaIDIOT

ответ

4

Вы ищете re.sub с функцией обратного вызова:

words = { 
    'person': ['you', 'me'], 
    'how': ['fine', 'stupid'], 
    'where': ['away', 'out'] 
} 

import re, random 

def random_str(m): 
    return random.choice(words[m.group(1)]) 


text = "[person] is feeling really [how] today, so he's not going [where]." 
print re.sub(r'\[(.+?)\]', random_str, text) 

#me is feeling really stupid today, so he's not going away. 

Заметим, что в отличие от метода format, это позволяет проводить более сложную обработку заполнителей, например,

[person:upper] got $[amount if amount else 0] etc 

В принципе, вы можете создать собственный «шаблонный двигатель» поверх этого.

+0

Это здорово, мне нравится, как я понимаю, насколько он чист и эффективен. Он делает это работу и понимает начинающего Python, что дает мне преимущество. :) Умная вещь заключалась бы в том, чтобы написать файл словаря, сохранить его на диске и загрузить в словарь слов здесь. Любые указатели на то, как синтаксис словарного файла будет выглядеть в файле? Большое спасибо! – bitworks

+0

@bitworks: самым простым и удобным вариантом является json: http://docs.python.org/2/library/json.html – georg

2

Вы можете использовать метод format.

>>> a = 'The weather today is {weather_state}.' 
>>> a.format(weather_state = 'awesome') 
'The weather today is awesome.' 
>>> 

также:

>>> b = '{person} is feeling really {how} today, so he\'s not going {where}.' 
>>> b.format(person = 'Alegen', how = 'wacky', where = 'to work') 
"Alegen is feeling really wacky today, so he's not going to work." 
>>> 

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

0

Если вы используете скобки вместо скобок, то ваша строка может использоваться как string formatting template.Вы можете заполнить его с большим количеством замен с помощью itertools.product:

import itertools as IT 

text = "{person} is feeling really {how} today, so he's not going {where}." 
persons = ['Buster', 'Arthur'] 
hows = ['hungry', 'sleepy'] 
wheres = ['camping', 'biking'] 

for person, how, where in IT.product(persons, hows, wheres): 
    print(text.format(person=person, how=how, where=where)) 

дает

Buster is feeling really hungry today, so he's not going camping. 
Buster is feeling really hungry today, so he's not going biking. 
Buster is feeling really sleepy today, so he's not going camping. 
Buster is feeling really sleepy today, so he's not going biking. 
Arthur is feeling really hungry today, so he's not going camping. 
Arthur is feeling really hungry today, so he's not going biking. 
Arthur is feeling really sleepy today, so he's not going camping. 
Arthur is feeling really sleepy today, so he's not going biking. 

Для генерации случайных предложений, вы можете использовать random.choice:

for i in range(5): 
    person = random.choice(persons) 
    how = random.choice(hows) 
    where = random.choice(wheres) 
    print(text.format(person=person, how=how, where=where)) 

Если вы должны использовать скобки и нет фигурных скобок в вашем формате, вы может заменить скобки с фигурными скобками, а затем продолжить, как указано выше:

text = "[person] is feeling really [how] today, so he's not going [where]." 
text = text.replace('[','{').replace(']','}') 
+0

Эта вещь 'person = person, how = how, where = where' может стать действительно глупой если у них их сотни. – georg

+0

Я решил держаться подальше от 'format (** locals())' здесь, потому что он не дал бы понять, как именно была сделана замена. Но если у вас есть сотни переменных, 'format (** locals())' будет способом. – unutbu