我希望使用正则表达式将单词分成几组(vowels, not_vowels, more_vowels)
,使用标记来确保每个单词都以元音开头和结尾。
import re
MARKER = "~"
VOWELS = {"a", "e", "i", "o", "u", MARKER}
word = "dog"
if word[0] not in VOWELS:
word = MARKER+word
if word[-1] not in VOWELS:
word += MARKER
re.findall("([%]+)([^%]+)([%]+)".replace("%", "".join(VOWELS)), word)
在这个例子中,我们得到:
[('~', 'd', 'o')]
问题是我希望匹配重叠 - 最后一组元音应该成为下一场比赛的第一组。如果我们按如下方式替换正则表达式,这似乎可以通过前瞻来实现:
re.findall("([%]+)([^%]+)(?=[%]+)".replace("%", "".join(VOWELS)), word)
我们得到:
[('~', 'd'), ('o', 'g')]
这意味着我们正在匹配我想要的。但是,它现在不返回最后一组元音。我想要的输出是:
[('~', 'd', 'o'), ('o', 'g', '~')]
我觉得这应该是可能的(如果正则表达式可以检查第二组元音,我看不出它不能返回它们的原因),但除了蛮力方法之外,我找不到任何方法,循环通过我拥有它们并将下一个匹配的第一个字符附加到最后一个匹配,并将字符串的最后一个字符附加到最后一个匹配之后的结果。有没有更好的方法可以做到这一点?
可行的两件事是捕获前瞻值,或者在捕获值的同时不消耗匹配中的文本-我也找不到任何方法。