8

私は単語の辞書を持っています (実際には、動詞の活用の辞書をネストしていますが、それは関係ありません)、それらを組み合わせて正規表現を作成したいと考えています。

{
  '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)?'

...しかし、一般的なフォームが必要です。それは可能ですか?

4

2 に答える 2

9

はい、可能だと思います。

始めるために、これが私が問題をどのように分析するかです.

拒否されたすべての値の先頭に一致する、可能な限り長い文字列を見つけてルートを計算します。

>>> 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)
于 2013-02-18T21:59:49.023 に答える