从单词后面的第二个元音中获得字符串的子字符串

问题描述 投票:1回答:3

我想这样做:

a = "Describe"

我想从后面用第二个元音单词分割"Describe",所以它将是"Descri""be"

另一个例子是"Public",应分为"Pu""blic"

我尝试过:

vowel = "AaIiUuEeOo"
consonant = "BbCcDdFfGgHhJjKkLlMmNnPpQqRrSsTtVvWwXxYyZz"
p = []
for char in words[::-1]:
    if char in consonant:
        p.append(char)
    elif char in vokal:
        p.append(char)
        break

我该如何实现?

python string
3个回答
1
投票

您可以使用正则表达式^(.*[AaIiUuEeOo])(?=.*[AaIiUuEeOo])(.+)$。这个想法是捕获所有内容直到一个元音,然后是另一个元音,以及可选的其他一些字符,这些字符将被放置在第二个捕获组中。]

>>> import re
>>> pattern = r"^(.*[AaIiUuEeOo])(?=.*[AaIiUuEeOo])(.+)$"
>>> re.match(pattern, "Describe").groups()
('Descri', 'be')
>>> re.match(pattern, "Public").groups()
('Pu', 'blic')
>>> re.match(pattern, "ibe").groups()
('i', 'be')
>>> re.match(pattern, "ie").groups()
('i', 'e')

如果字符串中没有至少两个元音,请在对结果调用None之前确保测试groups()

[另一个想法是使用itertools.groupby,它笨拙但有趣,并且可以很好地概括为任何itertools.groupby或任何字符集(就此而言,还是可迭代的,在这里我都固定在字符串上。)

n

输出:

from itertools import groupby

def nth_from_rear(s, n=2, matches="aeiou"):
    def nth_counter(n=2, count=0):
        def cb(x):
            nonlocal count

            if x.lower() in matches:
                count += 1

            return count >= n

        return cb

    groups = groupby(s[::-1], key=nth_counter(n))
    return ["".join(x)[::-1] for _, x in groups][::-1]


if __name__ == "__main__":
    tests = [
        ["Public", 2],
        ["Describe", 2],
        ["ie", 2],
        ["ibbe", 2],
        ["Describe", 0],
        ["Describing", 1],
        ["Describe", 3],
        ["ababbaba", 4],
    ]

    for s, n in tests:
        print(s.rjust(10), n, nth_from_rear(s, n))

0
投票

如果您希望不使用任何库:


0
投票

这里是另一种解决方案。它首先以相反的顺序迭代单词以找到作为元音的nth

© www.soinside.com 2019 - 2024. All rights reserved.