3

量的詩 (ギリシア語やラテン語の詩で使用されるものなど) では、行は spondees と dactyls と呼ばれる部分に分割されます。dactyl は長母音 (ā など) の後に 2 つの短母音が続き、spondee は 2 つの長母音です。

私の目標は、Python で行を spondees と dactyls に自動分割することです。

次のような行が与えられた場合

ārma virūmqe canō

出力を取得しようとしています

arma vi / rūmque ca / nō

正規表現を使用してパターン (long,short,short) または (long,long) を見つけるのは良い考えだと思っていましたが、その事実に対処する方法がわかりません。これらの母音が連続することはめったになく、それらの間の子音の数は毎回異なります。

正規表現を使用して、それらの間に任意の数の他の無関係な文字がある特定の文字を探す方法はありますか? そうでない場合、同じ目標を達成するための比較的エレガントな別の方法はありますか?

編集:

さらに例が必要な場合は、 @ Junuxxが素晴らしいサイトを指摘してくれました。上記の例を取得した、アエネーイスの最初の7行のスキャンの写真へのリンクを次に示します。セグメントに母音が 2 つしかない場合はいつでも、それは spondee です。3つある場合、それはダクティルです。太字の行は、行の 3 番目の区分を示しているだけなので、無視してください。

編集 II:

私の例でタイプミスをしたようです。「virumqe」と書きましたが、実際には「virumque」です。ラテン語では、(ae,au,ei,eu,oe) は二重母音であり、1 つの母音として扱われます。それでは、質問を修正して、それらにも対処できるかどうかを尋ねる必要があると思います。

4

1 に答える 1

4

以下のコードはあなたの例で機能しますが、子音を一致させる簡潔な方法がないため、正規表現はかなり長くなります。

dactyl の正規表現の内訳:

 [^āēīōūaeiou]*  # 0 or more consonants
 [āēīōū]         # a long vowel
 [^āēīōūaeiou]*  # 0 or more consonants
 [aeiou]         # a short vowel
 [^āēīōūaeiou]*  # 0 or more consonants
 [aeiou]         # a short vowel 
 [^āēīōūaeiou]*? # 0 or more consonants, but as few as possible

コード:

# -*- coding: utf-8 -*-

import re
s = u"ārma virūmqe canō"
# Long vowels: āēīōū

m = re.findall(u'([^āēīōūaeiou]*[āēīōū][^āēīōūaeiou]*' # Dactyls
               u'[aeiou][^āēīōūaeiou]*[aeiou][^āēīōūaeiou]*?'
               u'|'
               u'[^āēīōūaeiou]*[āēīōū][^āēīōūaeiou]*?'  # Spondees
               u'[āēīōū]?[^āēīōūaeiou]*'
               u'|'
               u'[\w\s]*)', s)                         # Catch all leftovers

try:
    print ' / '.join(m)
except:
    print 'no match'

出力:

ārma vi / rūmqe ca / nō
于 2012-10-28T02:03:59.990 に答える