我想这样做:
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
我该如何实现?
您可以使用正则表达式^(.*[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))
如果您希望不使用任何库:
这里是另一种解决方案。它首先以相反的顺序迭代单词以找到作为元音的nth