【问题标题】:count the number of words in a string separated by spaces and/or punctuation marks计算由空格和/或标点符号分隔的字符串中的单词数
【发布时间】:2016-01-21 06:37:12
【问题描述】:

有人可以帮忙吗。 我想创建一个程序,可以计算由空格和/或标点符号分隔的字符串中的单词数。你应该只计算元音和辅音交替出现的单词。一个词不能有两个连续的元音或辅音。单字母单词不计算在内。忽略文件中不是元音或常量的任何内容。用一个空格替换字母表中没有的任何内容。每个字母是否区分大小写无关紧要。

要使用的字母 元音——A E I O U Y 辅音 -- B C D F G H J K L M N P Q R S T V W X Z

输入: 一个字符串,例如“Hello there great new world”

输出: 在上面的输入字符串中找到的所需单词的数量。例如 1

示例:

“欢迎来到 Radix !!!” == 2(到基数)

“大家,感谢您尝试这个。” == 2(每个人都为)

“你好,伟大的新世界”== 1(新)

"Mary,had,a,little,lamb" == 2 (Mary had)

【问题讨论】:

  • 我编辑了预期的结果,“你”不是交替的。

标签: python-3.x


【解决方案1】:

这是作业,不是吗?

试试这个正则表达式:

\b[aeiouy]?([bcdfghjklmnpqrstvwxz][aeiouy])*[bcdfghjklmnpqrstvwxz]?\b

它将找到所有元音/辅音交替出现的单词。请注意,它也会传递单字母单词,随后将它们过滤掉。并使用忽略大小写标志运行它。

【讨论】:

    【解决方案2】:
    import string,re
    
    VOWELS=[x.lower() for x in "A E I O U Y".split(" ")]
    CONSONANTS = [x.lower() for x in "B C D F G H J K L M N P Q R S T V W X Z".split(" ") ]
    FILE_PATH = 'sentences.txt'
    PUNCT = '[ %s]'% string.punctuation #[ !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]
    
    
    def isAlt(word):
        #True if word is valid
        word=word.lower() #Non-case-sensitive
        for x in range(len(word)-1):
            if not (word[x] in VOWELS and word[x+1] in CONSONANTS)and not(word[x+1] in VOWELS and word[x] in CONSONANTS):
                #Sorry about that condition, I can probably return that whole line
                return False
        return True
    
    
    
    for line in open(FILE_PATH,'r'):
        out=re.split(PUNCT,line.strip())
        out=[x for x in out if x and len(x)>1 and isAlt(x)]
        print(len(out))
    

    这会扫描文件并为每一行查找有效单词并打印出符合您条件的单词数。您可以将列表的len(out) 更改为out,而不是数字。

    【讨论】:

    • 感谢 T Bell,但我无法理解
    • 对不起,您能解释一下您在理解方面有什么困难吗?这样我就可以更改我的答案以使其更易于理解。
    • T Bell....这是一个很好的答案,它有效.....您能否详细说明以下代码行.......PUNCT = '[ %s]' % string.punctuation .......... if not (word[x] in VOWELS and word[x+1] in CONSONANTS)and not(word[x+1] in VOWELS and word[x] in CONSONANTS) .....................out=[x for x in out if x and len(x)>1 and isAlt(x)].... .........谢谢
    • 第一行是创建一个正则表达式(来自 re 模块),其中包含所有标点符号来拆分字符串。 %s 表示用字符串替换,因此引号外的 % 符号将 %s 替换为 string.punctuation(我已经注释了它后面的字符串)。第二行检查每个字母以查看当前一个是否为辅音,下一个是否为元音,反之亦然。第三行使用单词列表,过滤掉不符合条件的单词。我希望我解释得足够好。
    • 是的,谢谢,...非常感谢
    猜你喜欢
    • 1970-01-01
    • 2022-07-29
    • 2010-12-01
    • 1970-01-01
    • 2022-08-12
    • 2013-07-22
    • 1970-01-01
    • 2013-10-24
    • 2019-08-10
    相关资源
    最近更新 更多