2013-02-18 61 views
7

我有一個單詞的詞典(實際上我有嵌套的動詞變形詞,但這不相關),我想通過組合它們來製作一個正則表達式。如何從單詞列表中創建正則表達式?

{ 
    'yo': 'hablaba', 
    'tú': 'hablabas', 
    'él': 'hablaba', 
    'nosotros': 'hablábamos', 
    'vosotros': 'hablabais', 
    'ellos': 'hablaban', 
    'vos': 'hablabas', 
} 

...使:

'habl((aba(s|is|n)?)|ábamos)' # I think that's right 

如果我不包括'hablábamos'很容易 - 他們都是相同的前綴,而我可以得到:

'hablaba(s|is|n)?' 

...但我想要一個一般的形式。那可能嗎?

+1

您是否正在嘗試從字典中的值生成正則表達式?或者你是否試圖寫一個正則表達式來驗證字典中的值。還是其他什麼東西? – Johnsyweb 2013-02-18 21:30:45

+1

我想生成它。我的標籤錯了嗎? – 2013-02-18 21:33:06

回答

6

是的,我相信這是可能的。

爲了讓你開始,這是我如何打破這個問題。

通過查找所有的下降值的開頭匹配儘可能長的字符串計算根:

>>> root = '' 
>>> for c in hablar['yo']: 
...  if all(v.startswith(root + c) for v in hablar.itervalues()): 
...   root += c 
...  else: 
...  break 
... 
>>> root 
'habl' 

無論剩下的言語,使神經末梢的list

>>> endings = [v[len(root):] for v in hablar.itervalues()] 
>>> print endings 
['abas', 'aba', 'abais', 'aba', '\xc3\xa1bamos', 'aban', 'abas'] 

那麼你可能想剔除掉重複:

>>> unique_endings = set(endings) 
>>> print unique_endings 
set(['abas', 'abais', '\xc3\xa1bamos', 'aban', 'aba']) 

然後,這些神經末梢連同管道連接:

>>> conjoined_endings = '|'.join(unique_endings) 
>>> print conjoined_endings 
abas|abais|ábamos|aban|aba 

形成正則表達式是一個簡單的事情相結合的根和圓括號中的conjoined_endings字符串:

>>> final_regex = '{}({})'.format(root, conjoined_endings) 
>>> print final_regex 
habl(abas|abais|ábamos|aban|aba) 
+1

謝謝@Johnsyweb,是的,這有幫助。但我不能投票給你:(「需要15個聲望」,我應該接受你嗎? – 2013-02-18 22:18:32

+0

@MalenaTorres:不客氣,希望這會讓你開始,即使我的語言條款關閉了,我很好奇爲什麼你想要壓縮正則表達式這麼多,你沒有處理大量的數據,更復雜的表達式只會增加你的驗證時間。 – Johnsyweb 2013-02-19 00:55:44

+1

我讓我的例子比它更簡單,真的會像'{'yo':'\ w + aba'}',&c。最後,我想比較不規則動詞和規則的規則,並且我會另有一個字典,例如'yo = {'imperfecto':'\ w + aba','presente':'\ w + o'}'。不規則動詞雖然更復雜,但現在我剛開始瞭解我的想法,看看我能做些什麼。 – 2013-02-19 15:12:19

3

我認爲你需要有一個不太聰明的做法

>>> x={ 
... 'yo': 'hablaba', 
... 'tú': 'hablabas', 
... 'él': 'hablaba', 
... 'nosotros': 'hablábamos', 
... 'vosotros': 'hablabais', 
... 'ellos': 'hablaban', 
... 'vos': 'hablabas', 
... } 
>>> x 
{'t\xc3\xba': 'hablabas', 'yo': 'hablaba', 'vosotros': 'hablabais', '\xc3\xa9l': 'hablaba', 'nosotros': 'habl\xc3\xa1bamos', 'ellos': 'hablaban', 'vos': 'hablabas'} 
>>> x.values 
<built-in method values of dict object at 0x20e6490> 
>>> x.values() 
['hablabas', 'hablaba', 'hablabais', 'hablaba', 'habl\xc3\xa1bamos', 'hablaban', 'hablabas'] 
>>> "|".join(x.values()) 
'hablabas|hablaba|hablabais|hablaba|habl\xc3\xa1bamos|hablaban|hablabas' 

如果你剛剛加入與交替操作的哈希值,那麼它應該做你想做的

+1

謝謝你Vorsprung :)但是我有很多單詞和其他變元(我給出的是不完美的變形,大約有15個變形),我不想用太多的空間。但是,你的想法是有效的:) – 2013-02-18 21:42:33

+1

我一直認爲電腦的內存比我的寶貴時間便宜:) – Vorsprung 2013-02-18 22:11:46

+0

保持簡單肯定有很多要說的! – Johnsyweb 2013-02-19 00:56:59