在定量的经文中(如希腊和拉丁诗歌中所使用的那样),线条被分为脊椎(spondees)和仙人掌(dactyls).上半身像是长元音(如ā),后跟两个短元音,而spondee是两个长元音.
我的目标是在Python中自动将行拆分为脊椎和精齿.
给定一行
ārma virūmqe canō
我正在尝试获取输出
arma vi / rūmque ca / nō
我一直在考虑使用正则表达式查找模式(long,short,short)或(long,long)将是一个好主意,但我似乎无法弄清楚如何处理以下事实:这些元音很少会是连续的,并且它们之间的辅音数量每次都会变化.
有没有办法使用正则表达式查找带有任意数量其他不相关字符的特定字符?如果不是,是否有另一种相对优雅的方法来实现相同的目标?
编辑:
如果需要更多示例,则@Junuxx指出了一个不错的网站. Here’s指向Aeneid的前7行的缩影图片的链接,我从上面得到了示例.每当一个段中只有两个元音时,它就是一块海绵.如果有三个,那就是一个指纹.忽略粗体线,因为它们仅表示一行中的第三部分.
编辑二:
看起来我在示例中打错了字.我写了“ virumqe”,而实际上该行是“ virumque”.在拉丁语中,(ae,au,ei,eu,oe)是双音,并被视为一个元音.那么,我想我必须修正我的问题,以询问是否也可以处理这些问题.
解决方法:
下面的代码适用于您的示例,但是正则表达式相当长,因为没有简明的方式来匹配辅音.
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ō