匹配模式与文本之间

时间:2012-10-28 01:47:41

标签: python regex substitution

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

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

给出像

这样的行
ārma virūmqe canō

我正在尝试获取输出

arma vi / rūmque ca / nō

我一直在想使用正则表达式找到模式(长,短,短)或(长,长)将是一个好主意,但我似乎无法弄清楚如何处理事实上这些元音很少是连续的,并且它们之间的辅音数量每次都会有所不同。

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

修改

如果您需要更多示例,@Junuxx指出了一个很棒的网站。 Here's链接到埃涅伊德前7行的scansion图片,我从上面得到了例子。每当一个片段中只有两个元音时,它就是一个spondee。如果有三个,那就是一个dactyl。忽略粗体线,因为它们只是指示一行中的第三个分区。

编辑II:

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

1 个答案:

答案 0 :(得分: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ō