2013-02-18 60 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