是的,我相信这是可能的。
为了让您开始,这就是我分解问题的方式。
通过查找与所有拒绝值的开头匹配的最长可能字符串来计算根:
>>> 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)