【问题标题】:Matching Patterns with Text in Between匹配模式与中间的文本
【发布时间】:2012-10-17 19:53:46
【问题描述】:

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

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

给定一行

ārma virūmqe canō

我正在尝试获取输出

arma vi / rūmque ca / nō

我一直认为使用正则表达式来查找模式 (long,short,short) 或 (long,long) 是一个好主意,但我似乎无法弄清楚如何处理事实上,这些元音很少是连续的,而且它们之间的辅音数量每次都会变化。

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

编辑:

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

编辑二:

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

【问题讨论】:

  • 你能再举几个例子吗,特别是对于spondee?
  • 我同意@poke。更多的例子会很好。我是希腊人,我什么都不懂:)
  • 有意思,根据this,例子应该分arma / vi rumque / ca no
  • 没错,但那个版本并不完整。 “ue”是一个双元音,这意味着它被算作一个元音。因此,元音是“i”、“u”和“ue”。该页面再往下一点,作者解释了更多,最终的大版本和我一样。
  • 如果拆分部分取决于发音(例如,spY),请参阅相关问题:Python: How to prepend the string 'ub' to every pronounced vowel in a string?

标签: python regex substitution


【解决方案1】:

下面的代码适用于您的示例,但是,正则表达式相当长,因为没有简洁的方法来匹配辅音。

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ō

【讨论】:

  • 你可以匹配所有除了元音。
  • 非常感谢!我想我终于开始理解正则表达式的力量了。不过,我很抱歉,但我在原始帖子中打错了字,因为您对备用扫描的评论,我才发现了一个错字。问题是,该行中有“ue”,它是一个双元音(拉丁语双元音是“ae,au,ei,eu,oe”)。双元音只被算作一个元音(显然在我看来也是如此),那么我的问题是如何处理这些元音。有没有办法将它纳入其中?还是我必须在正则表达式之外做一些事情?
  • @Tutleman:我想这应该很容易解决,只需在正确的地方添加几个+es 和*s。它在有 3 个或 4 个元音的情况下如何工作? (例如 quaestor、quiae)
  • @Junuxx 太棒了!再次感谢!对于 quaestor,“ua”不是双元音(顺便说一句,它很长),但“ae”是,所以“u”会很短,“ae”会很长。它会是“quāēstor”。对于 quiae,“ui”和“ia”都不是双元音,所以“u”是一个元音,“i”是一个元音,“āē”是一个元音。
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多