はい、可能だと思います。
始めるために、これが私が問題をどのように分析するかです.
拒否されたすべての値の先頭に一致する、可能な限り長い文字列を見つけてルートを計算します。
>>> 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)