2012-11-27 49 views
2

我正在寻找一种算法或一些建议来实现它。
输入:文本生成算法

"{1|2} word {3|4}" 

输出:

["1 word 3", "1 word 4", "2 word 3", "2 word 4"] 

而且,我想支持嵌套结构 - "{1|2{0|1}}" -> ["1", "20", "21"]
我意识到这个问题是太一般了,但不希望实现车轮。也许你看到了类似的东西。

UPD

from pyparsing import * 
from collections import deque 

s = u"{1|2} {3|4}" 

deque = deque() 

def mesh_lists(listOne, listTwo): 
    result = [] 
    for l1 in listOne: 
     for l2 in listTwo: 
      firstWord = str(l1).strip() 
      secondWord = str(l2).strip() 
      result.append(" " + firstWord + " " + l2 + " ") 
    return result 

def action(string, pos, token): 
    global deque 
    deque.append(list(token[0])) 

def processDeque(): 
    global deque 
    while len(deque) > 1: 
     l1 = deque.popleft() 
     l2 = deque.popleft() 
     res = mesh_lists(l1,l2) 
     deque.appendleft(res) 
    return [x.strip() for x in deque[0]] 

_lcurl = Suppress('{') 
_rcurl = Suppress('}') 
_pipe = Suppress('|') 
word = Regex("[^{|}]+") 
varBlock = Forward() 
entry = word | varBlock 
varList = Group(entry + ZeroOrMore(_pipe + entry)) 
varBlock << (_lcurl + Optional(varList) + _rcurl).setParseAction(action) 
template = ZeroOrMore(entry) 

res = template.parseString(s) 
print processDeque() 

它仅支持 “{||} {} ||” 结构。没有裸字,没有嵌套结构。

+1

如果问题太笼统,可能会被关闭。尝试一起收集您的想法和尝试,并向我们展示您的想法。虽然我之前在计算理论书籍中看到过这样的问题 - 但总体思路是在字母表中夹入一个不变的标记。 – Makoto

+0

@AustinHenley更新 – Deck

回答

0

pyparsing公布的例子包括正则表达式逆变器。