2013-07-13 42 views
0

我在做這樣的事情stucked ..的Python 3 - 紡紗文本

從這個

{Hi|Hello} I am - {Me|You|Us} 

這個

#Possible results 
'Hi I am - You' 
'Hello I am - Me' 
'Hi I am - Us' 
'Hello I am - You' 

所以基本上,代碼將搜索單詞,並將其用大括號{}括起來。那些花括號裏面有多個詞將被分割。總而言之,每個花括號只會輸出單詞,它會隨機選擇。

我需要這樣的正則表達式嗎?我試圖尋找預製圖書館,但我只是發現了一個過時的圖書館..任何人都可以幫忙嗎?

+0

你不能以任何可理解的方式解釋你想要做什麼。 –

+0

「你好,我 - 我們」和「你好,我 - 我」可能嗎? –

+0

對不起,我只是更新了我的問題。對於不清楚的一個,我真的很沮喪。 –

回答

0

如果輸入相對比較簡單 - 的{}唯一出現是如圖所示的問題提供了多種可能的文本片段的目的 - 你可以使用正則表達式像下面這樣:

import re 

p = re.compile('(\{[^\}]+\}|[^\{\}]*)') 

那麼你還是文本分成片段,像這樣:

frags = p.split("{Foo|Bar} baz {quux|wibble}.") 
# ['', '{Foo|Bar}', '', ' baz ', '', '{quux|wibble}', '', '.', ''] 

每串在這個列表中,您可以生成可能值的列表(鄰NLY一個字符串不開始{):

def options(s): 
    if len(s) > 0 and s[0] == '{': 
     return [opt for opt in s[1:-1].split('|')] 
    return [s] 

options("foo") 
# ["foo"] 

options("{foo|bar}") 
# ["foo", "bar"] 

然後建立選項列表的列表:

opt_lists = [options(frag) for frag in frags] 

然後建立笛卡爾乘積並加入:

import itertools 

for spec in itertools.product(*opt_lists): 
    print(''.join(spec)) 

這裏的"{Foo|Bar} baz {quux|wibble}."的輸出示例:

Foo baz quux. 
Foo baz wibble. 
Bar baz quux. 
Bar baz wibble. 

如果輸入中存在其他複雜性,則可能需要爲實際輸入格式使用更復雜的正則表達式或解析器,但生成作爲中間結果的選項列表的一般想法仍然有效。

+0

這實際上有效!你,先生,讓我的一天變得美麗。非常感謝! –

0

嘗試了這一點:

Tintadgel:~ dhoelzer$ python 
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import re 
>>> p = re.compile('(Hi|Hello) I am - (Me|You|Us)') 
>>> print p.match("Hi I am - You") 
<_sre.SRE_Match object at 0x106481470> 
>>> p.match("Hi I am - Yo") 
>>> 

這裏發生了什麼。我們從導入正則表達式庫開始。完成後,我們接下來編譯一個正則表達式,查找以「Hi」或「Hello」開頭的字符串,並以下列之一結束:Me,You and Us。

隨着創建,我們現在可以直接運行匹配它。請注意,print p.match("Hi I am - You")返回一個對象。這意味着我們有一場比賽!相反,p.match("Hi I am - Yo")不會返回任何內容,表示沒有找到匹配項。

希望這會有所幫助!您可能需要採取偷看http://docs.python.org/2/howto/regex.html

+0

我很欣賞答案,但這不是我想要做的。可以理解,因爲我不清楚我的問題。道歉! –

+0

那你打算怎麼做呢? –