2012-11-27 45 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公佈的例子包括正則表達式逆變器。