如何检测字符串中的元音,并且如果在元音旁边有特定的字母,那么它也被认为是字符串?

问题描述 投票:0回答:2

正在研究一个函数,该函数将检测给定字符串中是否存在任何元音,还要检查字母“ g”是否在元音旁边。如果字母“ g”在元音旁边,则也将被视为元音。我确实发布了与此类似的问题,并得到了几乎可以解决的答案,但是我没有对此做任何解释,也没有人回答我的评论,要求进行澄清。

这里是功能:

    import re


def disemvowel(text):
    result = re.sub(r"G[AEIOU]+|[AEIOU]+G|[AEIOU]+", "", text, flags=re.IGNORECASE)
    print(result)


disemvowel("fragrance")
# frrnc

disemvowel('gargden')
# rgdn

disemvowel('gargdenag')
# rgdn

此功能在大多数情况下都有效,除了字母“ g”在元音之前和超出元音时。例如,当我输入'gag'时它不起作用,当它不应该返回任何值时返回'g'。我只需要澄清此功能的工作原理,以及我可以对其进行哪些编辑以使其在所有情况下都能正常运行。

这是我最初使用的函数,但仅适用于元音,因为我不知道如何添加条件来检测元音旁的字母'g':

def disemvowel(text):
text = list(text)
new_letters = []
for i in text:
    if i.lower() == "a" or i.lower() == "e" or i.lower() == "i" or i.lower() == "o" or i.lower() == "u":
        pass
    else:
        new_letters.append(i)
print (''.join(new_letters))

disemvowel('fragrance')
# frgrnc
python-3.x for-loop if-statement while-loop
2个回答
0
投票

两种方法。

import re
def methodA(txt,ii):

    vowels = ['a', 'e', 'i', 'o', 'u']
    txt = re.sub('g'+ vowels[ii] +'g' ,' ', txt) # remove strings like gug
    txt = re.sub(vowels[ii] + 'g', ' ', txt) # remove strings like ug
    txt = re.sub('g' + vowels[ii] , ' ', txt) # remove strings like gu

    if (ii == len(vowels)-1 or txt == '' or txt == ' ') : # if string is empty or all vowels have been used
        txt = "".join( list(filter(lambda x:x not in ['a', 'e', 'i', 'o', 'u'], list(txt)))) # finally remove all vowels
        txt = re.sub(' ', '', txt)
        return txt
    ii = ii + 1
    return methodA(txt, ii) # call the function with next vowel in the list

ans = methodA(“ fragrance”,0)#用第零个元音初始化

frrnc

from itertools import permutations
def methodB(txt):
    vowels = ['a', 'e', 'i', 'o', 'u'] # vowels to remove
    a = [] # store permutation of strings to remove in this list
    for vowel in vowels: # create the list of all combo of characters that need to be removed
        a.extend(list(map(lambda x : x[0]+x[1]+x[2]  , list(permutations('g' + vowel + 'g')) )) )
        a.extend(list(map(lambda x : x[0]+x[1]  , list(permutations('g' + vowel )) )))

    lims = list(set([re.sub('gg','', xx)  for xx in a ])) # we don't need gg and the duplicates
    lims.sort(key = len,reverse = True) # create a list of strings sorted by length
    for ll in lims:
        txt = re.sub(ll, ' ', txt) # remove the required strings with largest ones first
    return re.sub(' ','',txt)

ans = methodB(“ fragrance”)

frrnc


0
投票

这里是此任务的解决方案:

def disemvowel(text):
    return re.sub(r"G?[AEIOU]+G?", "", text, flags=re.IGNORECASE)


tests = {"fragrance": "frrnc", "gargden": "rgdn", "gargdenag": "rgdn", "gag": ""}

for test, value in tests.items():
    assert disemvowel(test) == value

print("PASSED")
© www.soinside.com 2019 - 2024. All rights reserved.