3

在定量诗歌中(就像希腊和拉丁诗歌中使用的那样),线条被分成称为 spondees 和 dactyls 的部分。dactyl 是一个长元音(如 ā),后跟两个短元音,而 spondee 是两个长元音。

我的目标是在 Python 中自动将行拆分为 spondees 和 dactyls。

给定一条线

ārma virūmqe canō

我正在尝试获取输出

arma vi / rūmque ca / nō

我一直在想,使用正则表达式来查找模式(长、短、短)或(长、长)是个好主意,但我似乎不知道如何处理这样一个事实这些元音很少是连续的,而且它们之间的辅音数量每次都会变化。

有没有办法使用正则表达式来查找具有任意数量的其他不相关字符的特定字符?如果没有,是否有另一种相对优雅的方式来实现相同的目标?

编辑:

如果您需要更多示例, @Junuxx指出了一个很棒的网站。这是埃涅阿斯纪前 7 行扫描图片的链接,我从中得到了上面的示例。每当一个片段中只有两个元音时,它就是一个 spondee。如果有三个,那就是dactyl。忽略粗线,因为它们只是表示一行中的第三个部分。

编辑二:

看起来我在我的例子中打错了。我写了“virumqe”,而实际上,该行是“virumque”。在拉丁语中,(ae,au,ei,eu,oe) 是双元音,被视为一个元音。那么,我想我必须修改我的问题以询问是否也可以处理这些问题。

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 回答