我有一个单词的词典(实际上我已经嵌套了动词变形的词组,但这不相关)我希望通过组合它们来制作正则表达式。
{
'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)?'
...但我想要一般形式。这可能吗?
答案 0 :(得分: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
形成正则表达式是一个简单的事情,它将括号中的root和conjoined_endings字符串组合在一起:
>>> final_regex = '{}({})'.format(root, conjoined_endings)
>>> print final_regex
habl(abas|abais|ábamos|aban|aba)
答案 1 :(得分: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'
如果您只是使用替换运算符加入哈希值,那么它应该执行您想要的操作